home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / COMMUNIC / 1572C.ZIP / XMODEM.ASM < prev    next >
Assembly Source File  |  1983-04-02  |  53KB  |  2,145 lines

  1.     TITLE    'MODEM FOR THE IBM PERSONAL COMPUTER: PC/DOS'
  2.     PAGE     63,132
  3. ;
  4. ;*    M  O  D  E  M   - -   FOR THE IBM PERSONAL COMPUTER    *
  5. ;*                                *
  6. ;*    This program was developed from                *
  7. ;*       MODEM.ASM  (Version 3.0)                *
  8. ;*       for CP/M to CP/M file transfers            *
  9. ;*    BY Ward Christensen        (CPM-UG Disk # 25)        *
  10. ;*    Refer to the last section of this source file for     *
  11. ;*    a complete modification history and credits to        *
  12. ;*    those who contributed to this version.            *
  13. ;*                                *
  14. ;* N O T I C E                            *
  15. ;*    This program is supplied for your personal and        *
  16. ;*    non-commercial use only. No commercial use permitted.    *
  17. ;*    Users of this program are granted limited rights to    *
  18. ;*    reproduce and distribute this program, provided        *
  19. ;*    the following conditions are met:             *
  20. ;*                                *
  21. ;*    1) This program must be supplied in original form,    *
  22. ;*     with no modifications.                 *
  23. ;*    2) Notices contained in this source file, and those    *
  24. ;*     produced by the executable program, must not be    *
  25. ;*     altered or removed.                    *
  26. ;*    3) This program may not be sold. Providing this        *
  27. ;*     program for consideration of any sort, including    *
  28. ;*     copying or distribution fees, is prohibited.        *
  29. ;*    4) This program may not be used on timesharing        *
  30. ;*     systems where fees are charged for access,        *
  31. ;*     or or supplied as part of any other form of        *
  32. ;*     rental access computing, without the express        *
  33. ;*     written permission of the author.            *
  34. ;*                                *
  35. ;*    PLEASE SEND PROBLEM REPORTS AND SUGGESTIONS        *
  36. ;*    TO:     John Chapman                    *
  37. ;*          844 S. Madison St.                *
  38. ;*          Hinsdale, Illinois  60521             *
  39. ;*          Compuserve = 70205,1217                *
  40.     SUBTTL    MACRO DEFINITIONS
  41.     page
  42. ;
  43. DOSCALL MACRO    FUNCTION,AREA ;INVOKE DOS SERVICE
  44.     IFNB    <AREA>
  45.     MOV    DX,OFFSET AREA    ;SET PARAMETER OFFSET
  46.     ENDIF
  47.     MOV    AH,FUNCTION    ;DOS FUNCTION CODE
  48.     INT    21H        ;INVOKE DOS SERVICE
  49.     ENDM
  50. ;
  51. PRCHAR    MACRO    CHAR    ;PRINT A CHARACTER
  52.     IFNB    <CHAR>
  53.     MOV    DL,CHAR ;CHAR TO DL REG
  54.     ENDIF
  55.     DOSCALL DSPLO    ; DOS PRINT CHARACTER FUNCTION
  56.     ENDM
  57. ;
  58. SCROLL    MACRO
  59.     MOV    AX,600H ;AH=6 SCROLL, AL=0 ENTIRE WINDOW
  60.     INT    10H    ;INVOKE BIOS SCROLL ROUTINE
  61.     ENDM
  62. ;
  63. LOCATE    MACRO
  64.     MOV    AH,2    ;BIOS FUNCTION SELECT
  65.     MOV    BH,0    ;USE SCREEN 0
  66.     INT    10H    ;INVOKE BIOS CURSOR POSITIONING
  67.     ENDM
  68. ;
  69. ;
  70.     SUBTTL    EQUATES
  71.     page
  72. ;
  73. CANFLG    EQU    1        ;NO CANCEL ABILITY
  74. ;
  75. MODSNDB EQU    020H        ;BIT TO TEST FOR SEND
  76. MODSNDR EQU    020H        ;VALUE WHEN READY
  77. MODRCVB EQU    001H        ;BIT TO TEST FOR RECEIVE
  78. MODRCVR EQU    001H        ;VALUE WHEN READY
  79. ;
  80. BAUDRAT EQU    0C2H        ;BAUD RATE OUTPUT
  81. DTREADY EQU    01H        ;MCR FLAG FOR DTR UP
  82. ;
  83. ;ORIGMOD EQU    1DH        ;8 DATA, NO PARITY, ORIG
  84. ;ANSWMOD EQU    1EH        ;8 DATA, NO PARITY, ANSW
  85. ;
  86. INITREQ EQU    0        ;MODEM INIT. REQ'D?INITC1       EQU     64H             ;FIRST INIT CHAR TO CTL PORT
  87. INITC2    EQU    64H        ;2ND INIT CHAR TO CTL PORT
  88. ;
  89. FASTCLK EQU    1        ;PUT 1 HERE FOR 4 MHZ CLOCK
  90. ERRLIM    EQU    10        ;MAX ALLOWABLE ERRORS
  91. EXITCHR EQU    'W'-40H         ;CTL-W EXIT FROM T OR C
  92. DISCCHR EQU    'D'-40H         ;CTL-D DISCONNECTS MODEM T/C
  93. CTLCCHR EQU    'I'-40H         ;CTL-C REPLACEMENT (temporary)
  94. CTLCHAR EQU    03H        ;CTL-C ACTUAL       (temporary)
  95. ;
  96. ;DEFINE ASCII CHARACTERS USED
  97. ;
  98. SOH    EQU    01H        ;START OF HEADER
  99. EOT    EQU    04H        ;END OF TRANSMISSION
  100. ACK    EQU    06H        ;ACKNOWLEDGE
  101. LF    EQU    0AH        ;LINEFEED
  102. CR    EQU    0DH        ;CARRIAGE RETURN
  103. NAK    EQU    15H        ;NEG ACKNOWLEDGE
  104. CAN    EQU    18H        ;CANCEL
  105. FF    EQU    0CH        ;FORM FEED (clear screen)
  106.     PAGE
  107. ;
  108. ; PC DOS EQUATES (VERSION 1.1)
  109. ;
  110. REIPL    EQU    0        ;PROGRAM TERMINATE
  111. RDCON    EQU    1        ;KEYBOARD INPUT
  112. WRCON    EQU    2        ;DISPLAY OUTPUT
  113. PRTCHR    EQU    5        ;PRINTER OUTPUT, CHAR IN DL
  114. DCON    EQU    6        ;DIRECT CONSOLE I/O
  115. PRINT    EQU    9        ;PRINT STRING
  116. CONST    EQU    11        ;CONSOLE STAT
  117. OPEN    EQU    15        ;0FFH=NOT FOUND
  118. CLOSE    EQU    16        ;    "       "
  119. SRCHF    EQU    17        ;    "       "
  120. SRCHN    EQU    18        ;    "       "
  121. ERASE    EQU    19        ;NO RET CODE
  122. READ    EQU    20        ;0=OK, 1=EOF
  123. WRITE    EQU    21        ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  124. MAKE    EQU    22        ;0FFH=BAD
  125. REN    EQU    23        ;0FFH=BAD
  126. STDMA    EQU    26        ;SET DMA
  127. FATADDR EQU    27        ;FILE ALLOCATION TABLE ADDRESS
  128. ;
  129. ;
  130. ; d o s   f u n c t i o n s
  131. ;
  132. ;
  133. DSPLO    EQU    2
  134. PSTRING EQU    9
  135. DRESET    EQU    0DH
  136. SELDSK    EQU    0EH
  137. SRCHF    EQU    11H
  138. SRCHN    EQU    12H
  139. CDISK    EQU    19H
  140. SETDTA    EQU    1AH
  141. FATADDR EQU    1BH
  142. SETINTV EQU    25H
  143. GETDATE EQU    2AH
  144. GETTIME EQU    2CH
  145. ;
  146. ;
  147. ;
  148. ; PC DOS FCB EQUATES (VERSION 1.1)
  149. ;
  150. INT20H    EQU    DS:00H
  151. FCB    EQU    DS:5CH
  152. FCBNAME EQU    DS:5DH
  153. FCBEXT    EQU    DS:65H
  154. FCBSZL    EQU    DS:6CH
  155. FCBSZH    EQU    DS:6DH
  156. FCBCR    EQU    DS:7CH
  157. FCBRR    EQU    DS:7DH
  158. FCB2    EQU    DS:6CH
  159.     SUBTTL    'PREFIX, CONSTANTS AND WORKAREA'
  160.     PAGE
  161. MODEM    SEGMENT PUBLIC 'CODE'
  162.     ASSUME    CS:MODEM,DS:MODEM,ES:MODEM
  163. ;
  164. ;    ----------------
  165. ;    START OF ACTUAL PROGRAM AREA
  166. ;    ----------------
  167.     ORG    100H
  168. MAIN    PROC    FAR
  169.     JMP    STARTS
  170. OPTION    DB    0        ;PRIMARY OPTION
  171. ;
  172. ;DATAFLG IS USED BY THE "V" SUBCOMMAND -
  173. ;IT IS 0 WHEN A HEADER OR CKSUM IS BEING
  174. ;SENT/RCD, AND 1 IF "VIEWABLE" DATA (THE
  175. ;SECTOR ITSELF) IS
  176. ;
  177. DATAFLG DB    0        ;AT HEADER, FIRST
  178. ;
  179. ;
  180. ;SUB-OPTION TABLE.  IF AN OPTION IS IN EFFECT,
  181. ;    THE CHARACTER IS SET TO BINARY 0
  182. ;
  183. OPTBL    EQU    OFFSET $
  184. ANSWFLG DB    'A'             ;ANSWER MODE
  185. DISCFLG DB    'D'             ;DISCONNECT WHEN DONE
  186. ECHOFLG DB    'E'             ;TO ECHO AFTER XFER
  187. DUMYFLG DB    'U'             ;DEFAULT UART FLAG
  188. INITFLG DB    'I'             ;TO INIT THE UART / MODEM
  189. ORIGFLG DB    'O'             ;ORIGINATE MODE
  190. QFLG    DB    'Q'             ;QUIET TRANSFER (NO MSGS)
  191. RSEEFLG DB    'R'             ;SEE WHAT'S RECEIVED
  192. SSEEFLG DB    'S'             ;SEE WHAT'S SENT
  193. TERMFLG DB    'T'             ;TO TERM AFTER XFER
  194. VSEEFLG DB    'V'             ;VIEW MESSAGES (NO HDR, ETC)
  195. urt2flg db    '2'             ;second UART
  196. urt3flg db    '3'             ;third UART
  197. OPTBE    EQU    OFFSET $    ;END OF OPTIONS
  198. ;
  199. TABLESIZE EQU    OPTBE-OPTBL
  200. ;
  201. ;------------------------------------------------------------------
  202. ; ** added for COM1/2/3 Select support for PC           8/82/jac
  203. ;------------------------------------------------------------------
  204. ;
  205. ;
  206. OFFDATP EQU    0      ;DATA PORT          OFFSET
  207. OFFCTLP EQU    5      ;MODEM STATUS REGISTER      OFFSET
  208. OFFCTL2 EQU    4      ;MODEM CONTROL REGISTER      OFFSET
  209. OFFCTL3 EQU    3      ;LINE CONTROL REGISTER      OFFSET
  210. ;
  211. ;
  212. BASE1U    dw    03f8h    ;base address uart 1 (COM1)
  213. base2u    dw    02F8h    ;base address uart 2 (COM2)
  214. base3u    dw    01F8h    ;base address uart 3 (COM3) ??NOT TESTED??;
  215. ;
  216. MODDATP dw    0      ;3F8H    ;DATA PORT
  217. MODCTLP dw    0      ;3FDH    ;MODEM STATUS REGISTER
  218. MODCTL2 dw    0      ;3FCH    ;MODEM CONTROL REGISTER
  219. MODCTL3 dw    0      ;3FBH    ;LINE CONTROL REGISTER
  220. ;
  221. ;
  222. RCVSNO    DB    0        ;SECT # RECEIVED
  223. SECTNO    DB    0        ;CURRENT SECTOR NUMBER
  224. ERRCT    DB    0        ;ERROR COUNT
  225. ;
  226. ;    FOLLOWING 3 USED BY DISK BUFFERING ROUTINES
  227. ;
  228. EOFLG    DB    0        ;EOF FLAG (1=TRUE)
  229. SECPTR    DW    DBUF
  230. SECINBF DB    0        ;# OF SECTORS IN BUFFER
  231. ;
  232. ;    HELP MSGS
  233. ;
  234. ;
  235. msg00    db    cr,lf
  236.  db '+---------------------------------------------------------------------+',cr,lf
  237.  db '| F                                                                   |',cr,lf
  238.  db '| M  O  D  E  M   - -   FOR THE IBM PERSONAL COMPUTER  (PC/DOS 1.1)   |',cr,lf
  239.  db '|                                                                     |',cr,lf
  240.  DB '|                                      All Rights Reserved            |',cr,lf
  241.  db '|---------------------------------------------------------------------|',cr,lf
  242.  db '|                                                                     |',cr,lf
  243.  db '|  N O T I C E :       Commercial use forbidden.                      |',cr,lf
  244.  db '|                                                                     |',cr,lf
  245.  db '|  This program is provided for personal and non-commercial use only. |',cr,lf
  246.  db '|  Sale is forbidden.         Users of this program are granted       |',cr,lf
  247.  db '|  limited rights to reproduce and distribute this program, provided  |',cr,lf
  248.  db '|  that a) the program is not sold, or provided for consideration     |',cr,lf
  249.  db '|  of any sort, including copying or distribution fees greater than   |',cr,lf
  250.  db '|  the face value of the media and postage. and b) the program is     |',cr,lf
  251.  db '|  provided in unmodified form, with this notice, and all other       |',cr,lf
  252.  db '|  documentation intact.                                              |',cr,lf
  253.  db '|                                                                     |',cr,lf
  254.  db '+---------------------------------------------------------------------+',cr,lf
  255.  db    cr,lf,0,1
  256. ;
  257. ;
  258. MSG01    DB    CR,LF
  259. ;         1234567890123456789012345678901234567890123456789012345678901234567890
  260.     DB    '----  M  O  D  E  M  ----  ',cr,lf,cr,lf
  261.     db    'Converted from  MODEM 3.0 by Ward Christensen     ',cr,lf
  262.     DB    'Sale, or any other commercial use forbidden',cr,lf
  263.     DB    'Version 3.2 for IBM PC/DOS',cr,lf
  264.     DB    '      R  E  A  D  Y        ',cr,lf
  265.     db    cr,lf,'$',1,0
  266. MSG01A    DB    'File Open, Ready to Receive',CR,LF,0
  267. MSG02    DB    'Awaiting #',0
  268. MSG03A    DB    'h rcd, not soh',CR,LF,0
  269. MSG03    DB    '+++ TIMEOUT +++',0
  270. MSG04    DB    '++ Bad Sector # in Hdr',CR,LF,0
  271. MSG05    DB    '++ CKSUM ++',0
  272. MSG06    DB    'Send # ',0
  273. MSG07    DB    'h rcvd, not ack ',CR,LF,0
  274. MSG08    DB    'Timeout on ack',CR,LF,0
  275. MSG09    DB    'Modem Program Cancelled ',CR,LF,0
  276. MSG10    DB    'File exists, Type Y to erase ',0
  277. MSG11    DB    'Can not open file$'
  278. MSG12    DB    'File open, Extent Length ',0
  279. MSG13    DB    'Awaiting Initial nak',CR,LF,0
  280. MSG14    DB    cr,lf,'Transfer Complete',CR,LF,0
  281. MSG15    DB    cr,lf,'Press Return to Disconnect',0
  282. MSG16    DB    '++ DISCONNECTED ++',0
  283. MSG17    DB    cr,lf,'++ Do not Forget - The Modem is'
  284.     DB    'NOT Disconnected',CR,LF,0
  285. ;    DB    'Use "M3 D" to Disconnect',CR,LF,0
  286. MSG18    DB    'Multiple errors encountered. '
  287.     DB    'Type Q to quit, R to Retry ',0
  288. MSG19    DB    CR,LF,'Press Return to Continue'
  289.     DB    CR,LF,0
  290. MSG20    DB    '++ Unable to Receive Block'
  291.     DB    CR,LF,'++ ABORTING ++$'
  292. MSG21    DB    'Can not Send Sector '
  293.     DB    '- ABORTING',CR,LF,'$'
  294. MSG22    DB    '++ ERROR - Can not make file',CR,LF
  295.     DB    '++ Directory must be full',CR,LF,'$'
  296. MSG22A    DB    '++ Can not Close Files ++$'
  297. MSG23    DB    '++ File Read ERROR ++$'
  298. MSG24    DB    '++ ERROR Writing File ++',CR,LF,'$'
  299. MSG25    DB    'Invalid option on modem command',CR,LF
  300.     DB    'PRESS RETURN FOR HELP, CTL-C IF NOT',CR,LF,1,0
  301. MSG26    DB    'Format for command is',CR,LF,CR,LF
  302.     DB    'MODEM # FILENAME',CR,LF,CR,LF
  303.     DB    'Where # is a 1 character primary option,',CR,LF
  304.     DB    ' which may be followed by sub-options,',CR,LF
  305. ;    DB    ' and by ".xxx" to set baud rate to xxx'
  306.     DB    CR,LF,CR,LF,1
  307.     DB    'Primary Options',CR,LF
  308.     DB    '    S to send a file',CR,LF
  309.     DB    '    R to receive a file',CR,LF
  310.     DB    '    T to act as a terminal',CR,LF
  311.     DB    '    E to act as a computer (echo data)',CR,LF
  312. ;    DB    '    D to disconnect the phone'
  313. ;    DB    '    (S100 modems only)',CR,LF
  314.     DB    '    H to print this help file'
  315.     DB    CR,LF,CR,LF,1
  316.     DB    'Secondary options',CR,LF
  317. ;    DB    '    A answer mode',CR,LF
  318. ;    DB    '    O originate mode',CR,LF
  319. ;    DB    '    D disconnect after execution',CR,LF
  320. ;    DB    '    I initialize uart  to defaults 300,n,8,1',CR,LF
  321.     DB    '    T go to terminal mode after file xfer',CR,LF
  322.     DB    '    E go to echo mode after file xfer',CR,LF
  323.     DB    '    Q quiet mode - no status msgs',CR,LF
  324.     DB    '    R show chars received',CR,LF
  325.     DB    '    S show chars sent',CR,LF
  326.     DB    '    V view file sent/received (no status)',CR,LF
  327. ;    DB    '    2 switch to COM2: - second rs232 port',CR,LF
  328. ;    DB    '    3 switch to COM3: - third  rs232 port',CR,LF
  329.     DB    CR,LF,'FOR EXAMPLES, TYPE MODEM X',CR,LF,1,0
  330. MSG27    DB    'Send file, ',CR,LF
  331.     DB    '    MODEM S fn.ft',CR,LF
  332.     DB    'Send another file',CR,LF
  333.     DB    '    MODEM S fn.ft',CR,LF
  334. ;    DB    'Then send a third file at 450 baud and disconnect'
  335. ;    DB    CR,LF,'    MODEM SD.450 fn.ft',CR,LF
  336.     DB    'Act as a terminal ',CR,LF
  337.     DB    '    MODEM T',CR,LF
  338.     DB    ' Use ctl-D to disconnect)',CR,LF
  339.     DB    'Receive file,  view it',CR,LF
  340.     DB    '    MODEM RV fn.ft',CR,LF,1,0
  341. ;
  342. DBUF    DB    128*16 DUP(?)    ;16 LOGICAL SECTOR BUFFER # 1
  343.                 ;   (* Four physical sectors)
  344.     DB    128*16 DUP(?)    ;16 LOGICAL SECTOR BUFFER # 2
  345.                 ;   (* Four physical sectors)
  346.                  TOTAL = one track on PC/DOS (8/512)
  347. ;    DB    'POOT'
  348.     SUBTTL    'MAIN PROGRAM SECTION'
  349.     PAGE
  350. STARTS:
  351. ;
  352. ;=============================================================================
  353. ;
  354. ;    CLEAR THE SCREEN (cursor = 1,1)
  355. ;
  356.     push    dx
  357.     SUB    CX,CX        ;UPPER LEFT CORNER
  358.     MOV    DX,184FH    ;BOTTOM RIGHT CORNER
  359.     MOV    BH,7        ;NORMAL ATTRIB FOR CLS
  360.     SCROLL            ;INVOKE BIOS TO CLEAR SCREEN
  361.     SUB    DX,DX        ;POINT TO ROW 1,COL 1
  362.     LOCATE            ;SET THE CURSOR TO TOP LEFT
  363. ;
  364. ;    PRINT THE STARTUP MESSAGE
  365. ;
  366.     MOV    DX,OFFSET MSG01 ;GET ID MESSAGE
  367.     MOV    CL,PRINT
  368.     CALL    BDOS        ;PRINT ID MESSAGE
  369.     pop    dx
  370. ;
  371. ;=============================================================================
  372. ;
  373. ;
  374. ;SAVE PRIMARY OPTION, VALIDATE SECONDARY OPT.
  375. ;
  376.     CALL    PROCOPT
  377. ;            IF WE RETURN FROM PROCOPT, A VALID
  378. ;            ACTION OPTION (not help or examples)
  379. ;            WAS FOUND .. PROCESSING CONTINUES
  380. ;
  381. ;INIT THE MODEM OR SERIAL PORT     (dtr UP always - THEN CHECK FOR "i" OPT.
  382. ;
  383.     CALL    INITMOD
  384. ;
  385. ;MOVE THE FILENAME FROM FCB 2 TO FCB 1
  386. ;
  387.     CALL    MOVEFCB
  388. ;
  389. ;
  390. ;GOBBLE UP GARBAGE CHARS FROM THE LINE
  391. ;PRIOR TO RECEIVE OR SEND
  392. ;
  393.     PUSH    DX
  394.     MOV    DX,MODDATP
  395.     IN    AL,DX
  396.     IN    AL,DX
  397.     POP    DX
  398. ;
  399. ;JMP TO APPROPRIATE FUNCTION
  400. ;
  401.     MOV    AL,OPTION    ;GET PRIMARY OPTION
  402. ;
  403.     CMP    AL,'C'          ;(COMPAT W/EARLIER
  404.     JNZ    L00001
  405.     JMP    TRMECHO     ;OPTION "COMPUTER")
  406. ;
  407. L00001: CMP    AL,'E'          ;TERMINAL IN ECHO
  408.     JNZ    L00002
  409.     JMP    TRMECHO     ;..MODE?;
  410. L00002: CMP    AL,'T'          ;TERMINAL..
  411.     JNZ    L00003
  412.     JMP    TERM        ;..MODE?;
  413. L00003    LABEL    NEAR
  414. ;    CMP    AL,'D'
  415. ;    JNZ    L00004
  416. ;    JMP    DISCONN
  417. ;L00004  LABEL     NEAR
  418. ;
  419.     CMP    AL,'S'          ;SEND..
  420.     JNZ    L00005
  421.     JMP    SENDFIL     ;..A FILE?;
  422. L00005: CMP    AL,'R'          ;RECEIVE..
  423.     JNZ    L00006
  424.     JMP    RCVFIL        ;..A FILE?;
  425. ;INVALID OPTION
  426. ;
  427.  
  428. L00006: JMP    BADOPT        ;BAD OPTIONS !
  429. ;
  430. ;RETURN TO PC DOS VIA INT 20H IN SEGMENT PREFIX
  431. ;
  432. EXIT:    PUSH    ES        ;SET RETURN SEGMENT TO STACK
  433.     SUB    AX,AX        ;CLEAR A REGISTER
  434.     PUSH    AX        ;PUT ZERO RETURN ADDR TO STACK
  435.     RET            ;FAR RETURN TO FORCE CS TO ...
  436. MAIN    ENDP            ;.. POINT TO SEGMENT PREFIX
  437. ; * * * * * * * * * * * * * * * * * * * *
  438. ;                    *
  439. ;    TERM: TERMINAL MODE        *
  440. ;                    *
  441. ; * * * * * * * * * * * * * * * * * * * *
  442. ;
  443. ;THIS PROGRAM SIMPLY SENDS KEYED CHARACTERS
  444. ;DOWN THE LINE, AND DISPLAYS CHARACTERS
  445. ;RECEIVED FROM THE LINE.  THIS MAKES IT
  446. ;SUITABLE FOR COMMUNICATION WITH TIME SHARING
  447. ;COMPUTERS, CBBS'S, OR ANOTHER PROGRAM
  448. ;RUNING "MODEM E" (ECHO MODE)
  449. ;
  450. ;TYPEZZ THE "EXITCHR" (ORIGINALLY CTL-E) TO EXIT.
  451. ;OR THE "DISCCHR" (ORIGINALLY CTL-D) TO DISCONN.
  452. ;
  453. ;A FUTURE ENHANCEMENT WILL BE TO WRITE THE
  454. ;RECEIVED DATA IN MEMORY, AND ALLOW IT TO
  455. ;BE WRITTEN TO DISK
  456. ;
  457. TERM    PROC    NEAR
  458.     CALL    STAT        ;LOCAL CHAR KEYED?    JNZ    L00007
  459.     JMP    TERML        ;..NO, CHECK LINE
  460. L00007: CALL    KEYIN        ;GET CHAR
  461.     CMP    AL,EXITCHR    ;TIME TO END?    JNZ    L00008
  462.     JMP    CKDIS        ;YES, CK DISCONN
  463. L00008: CMP    AL,DISCCHR    ;DISCONNECT REQUEST?    JNZ    L00009
  464.     JMP    DISCONN     ;YES, DO IT
  465. L00009: PUSH    DX
  466.     MOV    DX,MODDATP
  467.     OUT    DX,AL        ;SEND THE CHAR
  468.     POP    DX
  469. ;
  470. ;SEE IF CHAR FROM LINE
  471. ;
  472. TERML:    PUSH    DX
  473.     MOV    DX,MODCTLP
  474.     IN    AL,DX        ;READ STATUS
  475.     POP    DX
  476.     AND    AL,MODRCVB    ;ISOLATE BIT
  477.     CMP    AL,MODRCVR    ;READY? JZ    L00010
  478.     JMP    TERM        ;..NO, LOOP
  479. L00010: PUSH    DX
  480.     MOV    DX,MODDATP
  481.     IN    AL,DX        ;READ DATA
  482.     POP    DX
  483.     CALL    TYPEZZ        ;TYPEZZ IT
  484.     JMP    TERM        ;LOOP
  485. TERM    ENDP
  486. ;
  487. ; * * * * * * * * * * * * * * * * * * * *
  488. ;                    *
  489. ;    TRMECHO: TERMINAL WITH ECHO    *
  490. ;                    *
  491. ; * * * * * * * * * * * * * * * * * * * *
  492. ;
  493. ;TERMINAL PROGRAM WITH ECHO - SEE NOTES
  494. ;UNDER "TERM" ABOVE
  495. ;
  496. ;C A U T I O N     DON'T RUN WITH BOTH COMPUTERS
  497. ;IN "ECHO" MODE - LINE ERRORS (OR ANY CHAR)
  498. ;WILL BE ECHOED BACK AND FORTH AD INFINITUM.
  499. ;
  500. TRMECHO PROC    NEAR
  501.     PUSH    DX
  502.     MOV    DX,MODCTLP
  503.     IN    AL,DX        ;GET STATUS
  504.     POP    DX
  505.     AND    AL,MODRCVB    ;ISOLATE READY BIT
  506.     CMP    AL,MODRCVR    ;ARE WE READY?    JNZ    L00011
  507.     JMP    LINECHR     ;YES, READ THE CHR
  508. L00011: CALL    STAT        ;CHECK LOCAL KB
  509.     JNZ    L00012
  510.     JMP    TRMECHO     ;..NO CHAR
  511. L00012: CALL    KEYIN        ;GET LOCAL CHAR
  512.     CMP    AL,EXITCHR    ;END?    JNZ    L00013
  513.     JMP    CKDIS        ;YES, CK DISCONN, EXIT
  514. L00013: CMP    AL,DISCCHR    ;DISCONN?    JNZ    L00014
  515.     JMP    DISCONN     ;..YES, DO IT.
  516. L00014: PUSH    DX
  517.     MOV    DX,MODDATP
  518.     OUT    DX,AL        ;SEND CHAR
  519.     POP    DX
  520.     CALL    TYPEZZ        ;ECHO IT LOCALLY
  521.     JMP    TRMECHO     ;..AND LOOP
  522. ;
  523. ;GOT CHAR FROM LINE
  524. ;
  525. LINECHR:
  526.     PUSH    DX
  527.     MOV    DX,MODDATP
  528.     IN    AL,DX        ;GET CHAR
  529.     OUT    DX,AL        ;ECHO IT
  530.     POP    DX
  531.     CALL    TYPEZZ        ;TYPEZZ IT
  532.     JMP    TRMECHO     ;LOOP
  533. TRMECHO ENDP
  534. ;
  535. ; * * * * * * * * * * * * * * * * * * * *
  536. ;                    *
  537. ;    SENDFIL: SENDS A CP/M FILE    *
  538. ;                    *
  539. ; * * * * * * * * * * * * * * * * * * * *
  540. ;
  541. ;THE CP/M FILE SPECIFIED IN THE MODEM COMMAND
  542. ;IS TRANSFERRED OVER THE PHONE TO ANOTHER
  543. ;COMPUTER RUNNING MODEM WITH THE "R" (RECEIVE)
  544. ;OPTION.  THE DATA IS SENT ONE SECTOR AT A
  545. ;TIME WITH HEADERS AND CHECKSUMS, AND RE-
  546. ;TRANSMISSION ON ERRORS.
  547. ;
  548. SENDFIL PROC    NEAR
  549.     CALL    OPENFIL     ;OPEN THE FILE
  550.     MOV    DL,80        ;WAIT 80 SEC..
  551.     CALL    WAITNAK     ;..FOR INITIAL NAK
  552. SENDLP: CALL    RDSECT        ;READ A SECTOR
  553.     JAE    L00016
  554.     JMP    SENDEOF     ;SEND EOF IF DONE
  555. L00016: CALL    INCRSNO     ;BUMP SECTOR #
  556.     XOR    AL,AL        ;ZERO ERROR..
  557.     MOV    ERRCT,AL    ;..COUNT
  558. SENDRPT:
  559.     CALL    SENDHDR     ;SEND A HEADER
  560.     CALL    SENDSEC     ;SEND DATA SECTOR
  561.     CALL    SENDCKS     ;SEND CKSUM
  562.     CALL    GETACK        ;GET THE ACK
  563.     JAE    L00017
  564.     JMP    SENDRPT     ;REPEAT IF NO ACK
  565. L00017: JMP    SENDLP        ;LOOP UNTIL EOF
  566. ;
  567. ;FILE SENT, SEND EOT'S
  568. ;
  569. SENDEOF:
  570.     MOV    AL,EOT        ;SEND..
  571.     CALL    SEND        ;..AN EOT
  572.     CALL    GETACK        ;GET THE ACK
  573.     JAE    L00018
  574.     JMP    SENDEOF     ;LOOP IF NO ACK
  575. L00018: JMP    DONE        ;ALL DONE
  576. SENDFIL ENDP
  577. ;
  578. ; * * * * * * * * * * * * * * * * * * * *
  579. ;                    *
  580. ;    RCVFIL: RECEIVE A FILE        *
  581. ;                    *
  582. ; * * * * * * * * * * * * * * * * * * * *
  583. ;
  584. ;RECEIVES A FILE IN BLOCK FORMAT AS SENT
  585. ;BY ANOTHER PERSON DOING "MODEM S FN.FT".
  586. ;
  587. RCVFIL    PROC    NEAR
  588.     CALL    ERASFIL     ;ERASE THE FILE
  589.     CALL    MAKEFIL     ;..THEN MAKE NEW
  590.     MOV    AL,QFLG     ;SEE IF IN QUIET MODE
  591.     OR    AL,AL
  592.     JZ    L00019
  593.     JMP    RCVLP        ;NOT IN QUIET MODE, SKIP MSG
  594. L00019: PUSH    BX
  595.     MOV    BX,OFFSET MSG01A
  596.     CALL    ILPRT        ;PRINT:
  597.     POP    BX
  598. RCVLP:    CALL    RCVSECT     ;GET A SECTOR
  599.     JAE    L00020
  600.     JMP    RCVEOT        ;GOT EOT
  601. L00020: CALL    WRSECT        ;WRITE THE SECTOR
  602.     CALL    INCRSNO     ;BUMP SECTOR #
  603.     CALL    SENDACK     ;ACK THE SECTOR
  604.     JMP    RCVLP        ;LOOP UNTIL EOF
  605. ;
  606. ;GOT EOT ON SECTOR - FLUSH BUFFERS, END
  607. ;
  608. RCVEOT: CALL    WRBLOCK     ;WRITE THE LAST BLOCK
  609.     CALL    SENDACK     ;ACK THE SECTOR
  610.     CALL    CLOSFIL     ;CLOSE THE FILE
  611.     MOV    AL,QFLG     ;QUIET..
  612.     OR    AL,AL        ;..MODE?    JNZ    L00021
  613.     JMP    CKDIS        ;YES, CK DISCONN, END.
  614. L00021: JMP    DONE        ;DISCONN IF REQ'D
  615. RCVFIL    ENDP
  616. ;
  617. ; * * * * * * * * * * * * * * * * * * * *
  618. ;                    *
  619. ;        SUBROUTINES        *
  620. ;                    *
  621. ; * * * * * * * * * * * * * * * * * * * *
  622. ;
  623. ;
  624. ;---->    RCVSECT: RECEIVE A SECTOR
  625. ;
  626. ;RETURNS WITH CARRY SET IF EOT RECEIVED.
  627. ;
  628. RCVSECT PROC    NEAR
  629.     XOR    AL,AL        ;GET 0
  630.     MOV    ERRCT,AL    ;INIT ERROR COUNT
  631. RCVRPT: MOV    AL,QFLG     ;QUIET? OR    AL,AL
  632.     JNZ    L00022
  633.     JMP    RCVSQ        ;YES, NO STAT MSG.
  634. L00022: PUSH    BX
  635.     MOV    BX,OFFSET MSG02
  636.     CALL    ILPRT        ;PRINT:
  637.     POP    BX
  638.     MOV    AL,SECTNO    ;GET SECTOR #
  639.     INC    AL        ;(REAL INR LATER)
  640.     CALL    HEXO        ;PRINT IN HEX
  641.     CALL    CRLF        ;..THEN CRLF
  642. ;
  643. RCVSQ:    MOV    CH,10        ;10 SEC TIMEOUT
  644.     CALL    RECV        ;GET SOH/EOT
  645.     JAE    L00023
  646.     JMP    RCVSTOT     ;TIMEOUT
  647. L00023: CMP    AL,SOH        ;GET SOH?    JNZ    L00024
  648.     JMP    RCVSOH        ;..YES
  649. ;
  650. ;EARLIER VERS. OF MODEM PROG SENT SOME NULLS -
  651. ;IGNORE THEM
  652. ;
  653. L00024: OR    AL,AL        ;00 FROM SPEED CHECK?    JNZ    L00025
  654.     JMP    RCVSQ        ;YES, IGNORE IT
  655. L00025: CMP    AL,EOT        ;END OF TRANSFER?    STC            ;RETURN WITH CARRY..
  656.     JNZ    L00026
  657.     RET            ;..SET IF EOT
  658. ;
  659. ;DIDN'T GET SOH  OR EOT -
  660. ;
  661. L00026: MOV    CH,AL        ;SAVE CHAR
  662.     MOV    AL,VSEEFLG    ;VIEWING..
  663.     OR    AL,AL        ;..MODE?    JNZ    L00027
  664.     JMP    RCVSEH        ;YES, PRT.MSG
  665. L00027: MOV    AL,QFLG     ;QUIET..
  666.     OR    AL,AL        ;..MODE?    JNZ    RCVSEH
  667.     JMP    RCVSERR     ;YES, SKIP MSG
  668. RCVSEH: MOV    AL,CH        ;GET CHAR
  669.     CALL    HEXO        ;SHOW IN HEX
  670.     PUSH    BX
  671.     MOV    BX,OFFSET MSG03
  672.     CALL    ILPRT        ;PRINT:
  673.     POP    BX
  674. ;
  675. ;DIDN'T GET VALID HEADER - PURGE THE LINE,
  676. ;THEN SEND NAK.
  677. ;
  678. RCVSERR:
  679.     MOV    CH,1        ;WAIT FOR 1 SEC..
  680.     CALL    RECV        ;..WITH NO CHARS
  681.     JNAE    L00029
  682.     JMP    RCVSERR     ;LOOP UNTIL SENDER DONE
  683. L00029: MOV    AL,NAK        ;SEND..
  684.     CALL    SEND        ;..THE NAK
  685.     MOV    AL,ERRCT    ;ABORT IF..
  686.     INC    AL        ;..WE HAVE REACHED..
  687.     MOV    ERRCT,AL    ;..THE ERROR..
  688.     CMP    AL,ERRLIM    ;..LIMIT?    JAE    L00030
  689.     JMP    RCVRPT        ;..NO, TRY AGAIN
  690. ;
  691. ;10 ERRORS IN A ROW -
  692. ;
  693. L00030: MOV    AL,VSEEFLG    ;VIEWING..
  694.     OR    AL,AL        ;..FILE?    JNZ    L00031
  695.     JMP    RCVCKQ        ;YES, ASK RETRY/QUIT
  696. L00031: MOV    AL,QFLG     ;QUIET..
  697.     OR    AL,AL        ;..MODE?    JNZ    RCVCKQ
  698.     JMP    RCVSABT     ;ABORT
  699. RCVCKQ: CALL    CKQUIT        ;RETRY/QUIT?    JNZ    RCVSABT
  700.     JMP    RCVSECT     ;TRY AGAIN
  701. ;
  702. RCVSABT:
  703.     CALL    CLOSFIL     ;KEEP WHATEVER WE GOT
  704.     MOV    DX,OFFSET MSG20
  705.     CALL    ERXIT
  706. ;
  707. ;TIMEDOUT ON RECEIVE
  708. ;
  709. RCVSTOT:
  710.     STI
  711.     MOV    AL,VSEEFLG    ;VIEWING..
  712.     OR    AL,AL        ;..MODE?    JNZ    L00034
  713.     JMP    RCVSPT        ;YES, PRT MSG
  714. L00034: MOV    AL,QFLG     ;QUIET..
  715.     OR    AL,AL        ;..MODE?    JNZ    RCVSPT
  716.     JMP    RCVSERR     ;YES, NO MSG
  717. RCVSPT: PUSH    BX
  718.     MOV    BX,OFFSET MSG03
  719.     CALL    ILPRT
  720.     POP    BX
  721. RCVPRN: MOV    AL,ERRCT    ;PRINT ERROR..
  722.     CALL    HEXO        ;..COUNT
  723.     CALL    CRLF
  724.     JMP    RCVSERR     ;BUMP ERR CT, ETC.
  725. ;
  726. ;GOT SOH - GET BLOCK #, BLOCK # COMPLEMENTED
  727. ;
  728. RCVSOH: MOV    CH,1        ;TIMEOUT = 1 SEC
  729.     CALL    RECV        ;GET SECTOR
  730.     JAE    L00036
  731.     JMP    RCVSTOT     ;GOT TIMEOUT
  732. L00036: MOV    DH,AL        ;D=BLK #
  733.     MOV    CH,1        ;TIMEOUT = 1 SEC
  734.     CALL    RECV        ;GET CMA'D SECT #
  735.     JAE    L00037
  736.     JMP    RCVSTOT     ;TIMEOUT
  737. L00037: NOT    AL        ;CALC COMPLEMENT
  738.     CMP    AL,DH        ;GOOD SECTOR #? JNZ    L00038
  739.     JMP    RCVDATA     ;YES, GET DATA
  740. ;
  741. ;GOT BAD SECTOR #
  742. ;
  743. L00038: MOV    AL,VSEEFLG    ;VIEWING..
  744.     OR    AL,AL        ;..MODE?    JNZ    L00039
  745.     JMP    RCVBSE        ;..YES, PRT MSG
  746. L00039: MOV    AL,QFLG     ;QUIET..
  747.     OR    AL,AL        ;..MODE?    JNZ    RCVBSE
  748.     JMP    RCVSERR     ;..YES, NO MSG
  749. ;
  750. RCVBSE: PUSH    BX
  751.     MOV    BX,OFFSET MSG04
  752.     CALL    ILPRT        ;PRINT:
  753.     POP    BX
  754.     JMP    RCVSERR     ;BUMP ERROR CT.
  755. ;
  756. ;
  757. RCVDATA:
  758.     MOV    AL,DH        ;GET SECTOR #
  759.     MOV    RCVSNO,AL    ;SAVE IT
  760.     MOV    AL,1        ;SHOW..
  761.     MOV    DATAFLG,AL    ;GETTING DATA
  762.     MOV    CL,0        ;INIT CKSUM
  763.     MOV    BX,80H        ;POINT TO BUFFER
  764.     CLI
  765. RCVCHR: MOV    CH,1        ;1 SEC TIMEOUT
  766.     CALL    RECV        ;GET CHAR
  767.     JAE    L00041
  768.     JMP    RCVSTOT     ;TIMEOUT
  769. L00041: MOV    BYTE PTR [BX],AL ;STORE CHAR
  770.     INC    BL        ;DONE?    JZ    L00042
  771.     JMP    RCVCHR        ;NO, LOOP
  772. ;
  773. ;VERIFY CHECKSUM
  774. ;
  775. L00042: MOV    DH,CL        ;SAVE CHECKSUM
  776.     XOR    AL,AL        ;SHOW..
  777.     MOV    DATAFLG,AL    ;..END OF DATA
  778.     MOV    CH,1        ;TIMEOUT LEN.
  779.     CALL    RECV        ;GET CHECKSUM
  780.     JAE    L00043
  781.     JMP    RCVSTOT     ;TIMEOUT
  782. L00043: STI
  783.     CMP    AL,DH        ;CHECKSUM OK?    JZ    L00044
  784.     JMP    RCVCERR     ;NO, ERROR
  785. ;
  786. ;GOT A SECTOR, IT'S A DUP IF = PREV,
  787. ;    OR OK IF = 1 + PREV SECTOR
  788. ;
  789. L00044: MOV    AL,RCVSNO    ;GET RECEIVED
  790.     MOV    CH,AL        ;SAVE IT
  791.     MOV    AL,SECTNO    ;GET PREV
  792.     CMP    AL,CH        ;PREV REPEATED? JNZ    L00045
  793.     JMP    RECVACK     ;ACK TO CATCH UP
  794. L00045: INC    AL        ;CALC NEXT SECTOR #
  795.     CMP    AL,CH        ;MATCH? JZ    L00046
  796.     JMP    ABORT        ;NO MATCH - STOP SENDER, EXIT
  797. L00046: RET            ;CARRY OFF - NO ERRORS
  798. ;
  799. ;GOT CKSUM
  800. ;
  801. RCVCERR:
  802.     MOV    AL,VSEEFLG    ;VIEWING..
  803.     OR    AL,AL        ;..MODE?    JNZ    L00047
  804.     JMP    RCVCPR        ;..YES, PRT MSG
  805. L00047: MOV    AL,QFLG     ;QUIET..
  806.     OR    AL,AL        ;..MODE?    JNZ    RCVCPR
  807.     JMP    RCVSERR     ;YES, NO MSG
  808. RCVCPR: PUSH    BX
  809.     MOV    BX,OFFSET MSG05
  810.     CALL    ILPRT
  811.     POP    BX
  812.     JMP    RCVPRN        ;PRINT ERROR #
  813. ;
  814. ;PREV SECT REPEATED, DUE TO THE LAST ACK
  815. ;BEING GARBAGED.  ACK IT SO SENDER WILL CATCH UP
  816. ;
  817. RECVACK:
  818.     CALL    SENDACK     ;SEND THE ACK,
  819.     JMP    RCVSECT     ;GET NEXT BLOCK
  820. ;
  821. ;SEND AN ACK FOR THE SECTOR
  822. ;
  823. SENDACK:
  824.     MOV    AL,ACK        ;GET ACK
  825.     CALL    SEND        ;..AND SEND IT
  826.     RET
  827. RCVSECT ENDP
  828. ;
  829. ;---->    SENDHDR: SEND THE SECTOR HEADER
  830. ;
  831. ;SEND: (SOH) (BLOCK #) (COMPLEMENTED BLOCK #)
  832. ;
  833. SENDHDR PROC    NEAR
  834.     MOV    AL,QFLG     ;QUIET..
  835.     OR    AL,AL        ;..MODE?    JNZ    L00049
  836.     JMP    SENDHNM     ;YES, SKIP STATUS MSG.
  837. L00049: PUSH    BX
  838.     MOV    BX,OFFSET MSG06
  839.     CALL    ILPRT        ;PRINT:
  840.     POP    BX
  841.     MOV    AL,SECTNO    ;PRINT..
  842.     CALL    HEXO        ;..SECT #
  843.     CALL    CRLF        ;..THEN CR/LF
  844. ;
  845. SENDHNM:
  846.     MOV    AL,SOH        ;SEND..
  847.     CALL    SEND        ;..SOH,
  848.     MOV    AL,SECTNO    ;THEN SEND..
  849.     CALL    SEND        ;..SECTOR #
  850.     MOV    AL,SECTNO    ;THEN SENDOR #
  851.     NOT    AL        ;..COMPLEMENTED..
  852.     CALL    SEND        ;..SECTOR #
  853.     RET            ;FROM SENDHDR
  854. SENDHDR ENDP
  855. ;
  856. ;---->    SENDSEC: SEND THE DATA SECTOR
  857. ;
  858. ;WHILE SENDING THE SECTOR, THE "DATAFLG" IS SET
  859. ;SUCH THAT IF "V" (VIEW THE FILE) WAS REQUESTED,
  860. ;THE "SHOW" ROUTINE WILL PRINT THE DATA, BUT NOT
  861. ;THE HDR OR CKSUM, OR ANY NON-FATAL MSGS.
  862. ;
  863. SENDSEC PROC    NEAR
  864.     MOV    AL,1        ;SHOW NOW AT DATA..
  865.     MOV    DATAFLG,AL    ;..FOR VIEW COMMAND
  866.     MOV    CL,0        ;INIT CKSUM
  867.     MOV    BX,80H        ;POINT TO BUFFER
  868. SENDC:    MOV    AL,BYTE PTR [BX] ;GET A CHAR
  869.     CALL    SEND        ;SEND IT
  870.     INC    BL        ;POINT TO NEXT CHAR
  871.     JZ    L00050
  872.     JMP    SENDC        ;LOOP IF <100H
  873. L00050: XOR    AL,AL        ;SHOW NOT INTO DATA..
  874.     MOV    DATAFLG,AL    ;..FOR VIEW COMMAND
  875.     RET            ;FROM SENDSEC
  876. SENDSEC ENDP
  877. ;
  878. ;---->    SENDCKS: SEND THE CHECKSUM
  879. ;
  880. SENDCKS PROC    NEAR
  881.     MOV    AL,CL        ;SEND THE..
  882.     CALL    SEND        ;..CHECKSUM
  883.     RET            ;FROM SENDCKS
  884. SENDCKS ENDP
  885. ;
  886. ;---->    GETACK: GET THE ACK ON THE SECTOR
  887. ;
  888. ;RETURNS WITH CARRY CLEAR IF ACK RECEIVED.
  889. ;IF AN ACK IS NOT RECEIVED, THE ERROR COUNT
  890. ;IS INCREMENTED, AND IF LESS THAN "ERRLIM",
  891. ;CARRY IS SET AND CONTROL RETURNS.  IF THE
  892. ;ERROR COUNT IS AT "ERRLIM", THE PROGRAM
  893. ;ABORTS IF IN "QUIET" MODE, OR ASKS THE
  894. ;USER FOR QUIT/RETRY IF NOT.
  895. ;
  896. GETACK    PROC    NEAR
  897.     MOV    CH,10        ;WAIT 10 SECONDS MAX
  898.     CALL    RECVDG        ;RECV W/GARBAGE COLLECT
  899.     JAE    L00051
  900.     JMP    GESATOT     ;TIMED OUT
  901. L00051: CMP    AL,ACK        ;OK? (CARRY OFF IF =)
  902.     JNZ    L00052
  903.     RET            ;YES, RET FROM GETACK
  904. ;
  905. L00052    LABEL    NEAR
  906.     IF    CANFLG
  907.     CMP    AL,CAN        ;CANCEL TRANSMISSION?    JNZ    L00053
  908.     JMP    ABORT        ;..YES
  909. L00053    LABEL    NEAR
  910.     ENDIF
  911. ;
  912.     MOV    CH,AL        ;SAVE CHAR
  913.     MOV    AL,QFLG     ;QUIET..
  914.     OR    AL,AL        ;..MODE?    JNZ    L00054
  915.     JMP    ACKERR        ;..YES, NO MSG
  916. L00054: MOV    AL,CH        ;GET CHAR
  917.     CALL    HEXO        ;PRINT IN HEX
  918.     PUSH    BX
  919.     MOV    BX,OFFSET MSG07
  920.     CALL    ILPRT        ;PRINT:
  921.     POP    BX
  922. ;
  923. ;TIMEOUT OR ERROR ON ACK - BUMP ERROR COUNT
  924. ;
  925. ACKERR: MOV    AL,ERRCT    ;GET COUNT
  926.     INC    AL        ;BUMP IT
  927.     MOV    ERRCT,AL    ;SAVE BACK
  928.     CMP    AL,ERRLIM    ;AT LIMIT?    JNB    L00055
  929.     RET            ;NOT AT LIMIT
  930. ;
  931. ;REACHED ERROR LIMIT
  932. ;
  933. L00055: MOV    AL,VSEEFLG    ;VIEWING..
  934.     OR    AL,AL        ;..FILE?    JNZ    L00056
  935.     JMP    GACKV        ;YES, ASK QUIT/RETRY
  936. L00056: MOV    AL,QFLG     ;QUIET..
  937.     OR    AL,AL        ;..MODE?    JNZ    GACKV
  938.     JMP    CSABORT     ;..YES, NO MCG
  939. GACKV:    CALL    CKQUIT        ;SEE IF WANT TO QUIT
  940.     STC            ;TO SHOW NO ACK
  941.     JNZ    CSABORT
  942.     RET            ;KEEP ON TRYIN'
  943. CSABORT:
  944.     MOV    DX,OFFSET MSG21
  945.     CALL    ERXIT
  946. GETACK    ENDP
  947. ;
  948. ;TIMEOUT GETTING ACK
  949. ;
  950. GESATOT PROC    NEAR
  951.     MOV    AL,QFLG     ;QUIET..
  952.     OR    AL,AL        ;..MODE?    JNZ    L00059
  953.     JMP    ACKERR        ;YES, NO MSG
  954. L00059: PUSH    BX
  955.     MOV    BX,OFFSET MSG08
  956.     CALL    ILPRT        ;PRINT:
  957.     POP    BX
  958.     JMP    ACKERR
  959. GESATOT ENDP
  960. ;
  961. ;---->    CKABORT: CHECK FOR LOCAL ABORT
  962. ;
  963. ;IF THE USER WANTS TO CANCEL THE TRANSMISSION,
  964. ;TYPING CTL-X WILL ABORT IT.  NOTE THIS TEST
  965. ;IS NOT MADE IF IN QUIET (NO CONSOLE I/O) MODE.
  966. ;
  967. CKABORT PROC    NEAR
  968.     MOV    AL,VSEEFLG    ;VIEWING?    OR    AL,AL
  969.     JNZ    L00060
  970.     JMP    CKABGO        ;YES, CHECK
  971. L00060: MOV    AL,QFLG     ;SUPPRESSED..
  972.     OR    AL,AL        ;..CONSOLE I/O? JNZ    L00061
  973.     RET            ;YES, NO TEST
  974. ;
  975. L00061    LABEL    NEAR
  976.     IF NOT CANFLG
  977.     RET
  978.     ENDIF
  979. ;
  980. CKABGO: CALL    STAT        ;KEY PRESSED?    JNZ    L00062
  981.     RET            ;NOTHING FROM KEYBOARD
  982. L00062: CALL    KEYIN        ;GET DATA
  983.     CMP    AL,EXITCHR    ;TIME TO END?    JZ    ABORT
  984.     RET            ;NO, CONTINUE
  985. ;
  986. ABORT:    NOP            ;LEA    SP,STACK
  987. ABORTL: MOV    CH,1        ;1 SEC. W/O CHARS.
  988.     CALL    RECV
  989.     JNAE    L00064
  990.     JMP    ABORTL        ;LOOP UNTIL SENDER DONE
  991. L00064: MOV    AL,CAN        ;CONTROL X
  992.     CALL    SEND        ;STOP SENDING END
  993. ABORTW: MOV    CH,1        ;1 SEC W/O CHARS.
  994.     CALL    RECV
  995.     JNAE    L00065
  996.     JMP    ABORTW        ;LOOP UNTIL SENDER DONE
  997. L00065: MOV    AL,' '          ;GET A SPACE...
  998.     CALL    SEND        ;TO CLEAR OUT CONTROL X
  999.     PUSH    BX
  1000.     MOV    BX,OFFSET MSG09
  1001.     CALL    ILPRT        ;EXIT WITH ABORT MSG
  1002.     POP    BX
  1003.     JMP    CKDIS        ;CHECK FOR DISCONN.
  1004. CKABORT ENDP
  1005. ;
  1006. ;---->    INCRSNO: INCREMENT SECTOR #
  1007. ;
  1008. INCRSNO PROC    NEAR
  1009.     MOV    AL,SECTNO    ;INCR..
  1010.     INC    AL        ;..SECT..
  1011.     MOV    SECTNO,AL    ;..NUMBER
  1012.     RET
  1013. INCRSNO ENDP
  1014. ;
  1015. ;---->    ERASFIL: ERASE THE INCOMING FILE.
  1016. ;
  1017. ;IF IT EXISTS, ASK IF IT MAY BE ERASED.
  1018. ;
  1019. ERASFIL PROC    NEAR
  1020.     MOV    DX,OFFSET FCB    ;POINT TO CTL BLOCK
  1021.     MOV    CL,SRCHF    ;SEE IF IT..
  1022.     CALL    BDOS        ;..EXISTS
  1023.     INC    AL        ;FOUND? JNZ    L00066
  1024.     RET            ;..NO, RETURN
  1025. L00066: PUSH    BX
  1026.     MOV    BX,OFFSET MSG10
  1027.     CALL    ILPRT        ;PRINT:
  1028.     POP    BX
  1029.     CALL    KEYIN        ;GET CHAR
  1030.     LAHF
  1031.     XCHG    AL,AH
  1032.     PUSH    AX
  1033.     XCHG    AL,AH
  1034.     CALL    TYPEZZ        ;ECHO
  1035.     POP    AX
  1036.     XCHG    AL,AH
  1037.     SAHF
  1038.     AND    AL,5FH        ;MAKE UPPER CASE
  1039.     CMP    AL,'Y'          ;WANT ERASED?   JZ      L00067
  1040.     JMP    CKDIS        ;QUIT IF NOT ERASE
  1041. L00067: CALL    CRLF        ;BACK TO START OF LINE
  1042. ;
  1043. ;ERASE OLD FILE
  1044. ;
  1045.     MOV    DX,OFFSET FCB    ;POINT TO FCB
  1046.     MOV    CL,ERASE    ;GET BDOS FNC
  1047.     CALL    BDOS        ;DO THE ERASE
  1048.     RET            ;FROM "ERASFIL"
  1049. ERASFIL ENDP
  1050. ;
  1051. ;---->    MAKEFIL: MAKES THE FILE TO BE RECEIVED
  1052. ;
  1053. MAKEFIL PROC    NEAR
  1054.     MOV    DX,OFFSET FCB    ;POINT TO FCB
  1055.     MOV    CL,MAKE     ;GET BDOS FNC
  1056.     CALL    BDOS        ;TO THE MAKE
  1057.     INC    AL        ;FF=BAD?    JZ    L00068
  1058.     RET            ;OPEN OK
  1059. ;DIRECTORY FULL - CAN'T MAKE FILE
  1060. L00068: MOV    DX,OFFSET MSG22
  1061.     CALL    ERXIT
  1062. MAKEFIL ENDP
  1063. ;
  1064. ;---->    OPENFIL: OPENS THE FILE TO BE SENT
  1065. ;
  1066. OPENFIL PROC    NEAR
  1067.     MOV    DX,OFFSET FCB    ;POINT TO FILE
  1068.     MOV    CL,OPEN     ;GET FUNCTION
  1069.     CALL    BDOS        ;OPEN IT
  1070.     INC    AL        ;OPEN OK?    JZ    L00069
  1071.     JMP    OPENOK        ;..YES
  1072. L00069: PUSH    DX
  1073.     MOV    DX,OFFSET MSG11
  1074.     CALL    ERXIT        ;..NO, ABORT
  1075.     POP    DX
  1076. ;
  1077. OPENOK:
  1078.     PUSH    X
  1079.     MOV    BX,OFFSET MSG12
  1080.     CALL    ILPRT        ;PRINT:
  1081.     POP    BX
  1082.     MOV    AL,FCBSZH    ;GET FILE SIZE HIGH ORDER
  1083.     CALL    HEXO        ;PRINT IN HEX
  1084.     MOV    AL,FCBSZL    ;GET FILE SIZE LOW ORDER
  1085.     CALL    HEXO        ;PRINT IN HEX
  1086.     MOV    AL,'H'
  1087.     CALL    TYPEZZ        ;PRINT 'H' AFTER NUMBER
  1088.     CALL    CRLF        ;..THEN CRLF
  1089.     RET
  1090. OPENFIL ENDP
  1091. ;
  1092. ;---->    CLOSFIL: CLOSES THE RECEIVED FILE
  1093. ;
  1094. CLOSFIL PROC    NEAR
  1095.     MOV    DX,OFFSET FCB    ;POINT TO FILE
  1096.     MOV    CL,CLOSE    ;GET FUNCTION
  1097.     CALL    BDOS        ;CLOSE IT
  1098.     INC    AL        ;CLOSE OK?    JZ    L00070
  1099.     RET            ;..YES, RETURN
  1100. L00070: MOV    DX,OFFSET MSG22A
  1101.     CALL    ERXIT        ;..NO, ABORT
  1102. CLOSFIL ENDP
  1103. ;
  1104. ;---->    RDSECT: READS A SECTOR
  1105. ;
  1106. ;FOR SPEED, THIS ROUTINE BUFFERS UP 16
  1107. ;SECTORS AT A TIME.
  1108. ;
  1109. RDSECT    PROC    NEAR
  1110.     MOV    AL,SECINBF    ;GET # SECT IN BUFF.
  1111.     DEC    AL        ;DECREMENT..
  1112.     MOV    SECINBF,AL    ;..IT
  1113.     JNS    L00071
  1114.     JMP    RDBLOCK     ;EXHAUSTED?  NEED MORE.
  1115. L00071: MOV    BX,SECPTR    ;GET POINTER
  1116.     MOV    DX,80H        ;TO DATA
  1117.     CALL    MOVE128     ;MOVE TO BUFFER
  1118.     MOV    SECPTR,BX    ;SAVE BUFFER POINTER
  1119.     RET            ;FROM "READSEC"
  1120. ;
  1121. ;BUFFER IS EMPTY - READ IN ANOTHER BLOCK OF 16
  1122. ;
  1123. RDBLOCK LABEL    NEAR
  1124.     MOV    AL,EOFLG    ;GET EOF FLAG
  1125.     CMP    AL,1        ;IS IT SET/
  1126.     STC            ;TO SHOW EOF
  1127.     JNZ    L00072
  1128.     RET            ;GOT EOF
  1129. L00072: MOV    CL,0        ;SECTORS IN BLOCK
  1130.     LEA    DX,DBUF     ;TO DISK BUFFER
  1131. RDSECLP LABEL    NEAR
  1132.     PUSH    CX
  1133.     PUSH    DX
  1134.     MOV    CL,STDMA    ;SET DMA..
  1135.     CALL    BDOS        ;..ADDR
  1136.     MOV    DX,OFFSET FCB
  1137.     MOV    CL,READ
  1138.     CALL    BDOS
  1139.     POP    DX
  1140.     POP    CX
  1141.     OR    AL,AL        ;READ OK?    JNZ    L00073
  1142.     JMP    RDSECOK     ;YES
  1143. L00073: DEC    AL        ;EOF?    JZ    REOF        ; 1 = EOF (regular)
  1144.     DEC    AL
  1145.     JZ    L00074        ; 2 = ERROR (trans area too small)
  1146.     DEC    AL
  1147.     JZ    REOF        ; 3 = EOF (partial block)
  1148.     JMP    L00074        ; ALL OTHER RETURNS CONSIDERED ERROR !!!
  1149. ;
  1150. ;READ ERROR
  1151. ;
  1152. L00074: MOV    DX,OFFSET MSG23
  1153.     CALL    ERXIT
  1154. ;
  1155. RDSECOK:
  1156.     MOV    BX,80H
  1157.     PUSH    SI
  1158.     PUSHF
  1159.     ADD    BX,DX
  1160.     RCR    SI,1
  1161.     POPF
  1162.     RCL    SI,1
  1163.     POP    SI        ;TO NEXT BUFF
  1164.     XCHG    BX,DX        ;BUFF TO DE
  1165.     INC    CL        ;MORE SECTORS?    MOV    AL,CL        ;GET COUNT
  1166.     CMP    AL,16        ;DONE?    JNZ    L00075
  1167.     JMP    RDBFULL     ;..YES, BUFF IS FULL
  1168. L00075: JMP    RDSECLP     ;READ MORE
  1169. ;
  1170. REOF:    MOV    AL,1
  1171.     MOV    EOFLG,AL    ;SET EOF FLAG
  1172.     MOV    AL,CL
  1173. ;
  1174. ;BUFFER IS FULL, OR GOT EOF
  1175. ;
  1176. RDBFULL:
  1177.     MOV    SECINBF,AL    ;STORE SECTOR COUNT
  1178.     MOV    BX,OFFSET DBUF    ;INIT BUFFER..
  1179.     MOV    SECPTR,BX    ;..POINTER
  1180.     MOV    DX,80H        ;RESET..
  1181.     MOV    CL,STDMA    ;..DMA..
  1182.     CALL    BDOS        ;..ADDR
  1183.     JMP    RDSECT        ;PASS SECT TO CALLER
  1184. RDSECT    ENDP
  1185. ;
  1186. ;---->    WRSECT: WRITE A SECTOR
  1187. ;
  1188. ;WRITES THE SECTOR INTO A BUFFER.  WHEN 16
  1189. ;HAVE BEEN WRITTEN, WRITES THE BLOCK TO DISK.
  1190. ;
  1191. ;ENTRY POINT "WRBLOCK" FLUSHES THE BUFFER AT EOF.
  1192. ;
  1193. WRSECT    PROC    NEAR
  1194.     MOV    BX,SECPTR    ;GET BUFF ADDR
  1195.     XCHG    BX,DX        ;TO DE FOR MOVE
  1196.     MOV    BX,80H        ;FROM HERE
  1197.     CALL    MOVE128     ;MOVE TO BUFFER
  1198.     XCHG    BX,DX        ;SAVE NEXT..
  1199.     MOV    SECPTR,BX    ;..BLOCK POINTER
  1200.     MOV    AL,SECINBF    ;BUMP THE..
  1201.     INC    AL        ;..SECTOR #..
  1202.     MOV    SECINBF,AL    ;..IN THE BUFF
  1203.     CMP    AL,16        ;HAVE WE 16?    JZ    WRBLOCK
  1204.     RET            ;NO, RETURN
  1205. ;
  1206. ;---->    WRBLOCK: WRITES A BLOCK TO DISK
  1207. ;
  1208. WRBLOCK:
  1209.     MOV    AL,SECINBF    ;# SECT IN BUFFER
  1210.     OR    AL,AL        ;0 MEANS END OF FILE
  1211.     JNZ    L00077
  1212.     RET            ;NONE TO WRITE
  1213. L00077: MOV    CL,AL        ;SAVE COUNT
  1214.     LEA    DX,DBUF     ;POINT TO DISK BUFF
  1215. DKWRLP: PUSH    BX
  1216.     PUSH    DX
  1217.     PUSH    CX
  1218.     MOV    CL,STDMA    ;SET DMA
  1219.     CALL    BDOS        ;TO BUFFER
  1220.     MOV    DX,OFFSET FCB    ;THEN WRITE
  1221.     MOV    CL,WRITE    ;..THE..
  1222.     CALL    BDOS        ;..BLOCK
  1223.     POP    CX
  1224.     POP    DX
  1225.     POP    BX
  1226.     OR    AL,AL
  1227.     JZ    L00078
  1228.     JMP    WRERR        ;OOPS, ERROR
  1229. L00078: MOV    BX,80H        ;LENGTH OF 1 SECT
  1230.     PUSH    SI
  1231.     PUSHF
  1232.     ADD    BX,DX
  1233.     RCR    SI,1
  1234.     POPF
  1235.     RCL    SI,1
  1236.     POP    SI        ;HL= NEXT BUFF
  1237.     XCHG    BX,DX        ;TO DE FOR SETDMA
  1238.     DEC    CL        ;MORE SECTORS?        JZ    L00079
  1239.     JMP    DKWRLP        ;..YES, LOOP
  1240. L00079: XOR    AL,AL        ;GET A ZERO
  1241.     MOV    SECINBF,AL    ;RESET # OF SECTORS
  1242.     MOV    BX,OFFSET DBUF    ;RESET BUFFER..
  1243.     MOV    SECPTR,BX    ;..POINTER
  1244. ;
  1245.     MOV    DX,80H        ;07/13/79 MOD..
  1246.     MOV    CL,STDMA    ;..TO RESET..
  1247.     CALL    BDOS        ;..DMA ADDR.
  1248. ;
  1249.     RET
  1250. ;
  1251. WRERR:    MOV    CL,CAN        ;CANCEL..
  1252.     CALL    SEND        ;..SENDER
  1253.     MOV    DX,OFFSET MSG24
  1254.     CALL    ERXIT        ;EXIT W/MSG:
  1255. WRSECT    ENDP
  1256. ;
  1257. ;---->    RECV: RECEIVE A CHARACTER
  1258. ;
  1259. ;TIMEOUT TIME IS IN B, IN SECONDS.  ENTRY VIA
  1260. ;"RECVDG" DELETES GARBAGE CHARACTERS ON THE
  1261. ;LINE.    FOR EXAMPLE, HAVING JUST SENT A SECTOR,
  1262. ;CALLING RECVDG WILL DELETE ANY LINE-NOISE-INDUCED
  1263. ;CHARACTERS "LONG" BEFORE THE ACK/NAK WOULD
  1264. ;BE RECEIVED.
  1265. ;
  1266. RECCHAR PROC    NEAR
  1267. RECVDG    LABEL    NEAR        ;RECEIVE W/GARBAGE DELETE
  1268.     PUSH    DX
  1269.     MOV    DX,MODDATP
  1270.     IN    AL,DX        ;GET A CHAR
  1271.     IN    AL,DX        ;..TOTALLY PURGE UART
  1272.     POP    DX
  1273. ;
  1274. RECV:    PUSH    DX        ;SAVE
  1275. ;
  1276.     IF    FASTCLK     ;4MHZ?    MOV    AL,CH        ;GET TIME REQUEST
  1277.     ADD    AL,AL        ;DOUBLE IT
  1278.     MOV    CH,AL        ;NEW TIME IN B
  1279.     ENDIF
  1280. ;
  1281. MSEC:    MOV    DX,50000    ;1 SEC DCR COUNT
  1282.     CALL    CKABORT     ;CHECK FOR EXIT REQUEST
  1283. MWTI:    PUSH    DX
  1284.     MOV    DX,MODCTLP
  1285.     IN    AL,DX        ;CHECK STATUS
  1286.     POP    DX
  1287.     AND    AL,MODRCVB    ;ISOLATE BIT
  1288.     CMP    AL,MODRCVR    ;READY? JNZ    L00080
  1289.     JMP    MCHAR        ;GOT CHAR
  1290. L00080: DEC    DL        ;COUNT..
  1291.     JZ    L00081
  1292.     JMP    MWTI        ;..DOWN..
  1293. L00081: DEC    DH        ;..FOR..
  1294.     JZ    L00082
  1295.     JMP    MWTI        ;..TIMEOUT
  1296. L00082: DEC    CH        ;MORE SECONDS?    JZ    L00083
  1297.     JMP    MSEC        ;YES, WAIT
  1298. ;
  1299. ;MODEM TIMED OUT RECEIVING
  1300. ;
  1301. L00083: POP    DX        ;RESTORE D,E
  1302.     STC            ;CARRY SHOWS TIMEOUT
  1303.     RET
  1304. ;
  1305. ;GOT CHAR FROM MODEM
  1306. ;
  1307. MCHAR:    PUSH    DX
  1308.     MOV    DX,MODDATP
  1309.     IN    AL,DX        ;READ THE CHAR
  1310.     POP    DX
  1311.     POP    DX        ;RESTORE DE
  1312. ;
  1313. ;CALC CHECKSUM
  1314. ;
  1315.     LAHF
  1316.     XCHG    AL,AH
  1317.     PUSH    AX
  1318.     XCHG    AL,AH        ;SAVE THE CHAR
  1319.     ADD    AL,CL        ;ADD TO CHECKSUM
  1320.     MOV    CL,AL        ;SAVE CHECKSUM
  1321. ;
  1322. ;CHECK IF MONITORING REC'D DATA
  1323. ;
  1324.     MOV    AL,RSEEFLG    ;SEE RECEIVED..
  1325.     OR    AL,AL        ;..DATA?    JNZ    L00084
  1326.     JMP    MONIN        ;..YES
  1327. ;
  1328. ;CHECK IF "VIEWING" AND THIS IS A DATA CHAR
  1329. ;
  1330. L00084: MOV    AL,VSEEFLG    ;VIEWING..
  1331.     OR    AL,AL        ;..DATA?    JZ    L00085
  1332.     JMP    NOMONIN     ;..NO
  1333. ;
  1334. ;"VIEW" REQUESTED.  SHOW THE CHAR IT IS DATA
  1335. ;
  1336. L00085: MOV    AL,DATAFLG    ;GET DATA FLAG
  1337.     OR    AL,AL        ;TEST IT
  1338.     JNZ    MONIN
  1339.     JMP    NOMONIN     ;..OFF, NOT DATA
  1340. MONIN:    POP    AX
  1341.     XCHG    AL,AH
  1342.     SAHF            ;..IS DATA,
  1343.     LAHF
  1344.     XCHG    AL,AH
  1345.     PUSH    AX
  1346.     XCHG    AL,AH        ;GET IT,
  1347.     CALL    SHOW        ;..AND SHOW IT
  1348. NOMONIN:
  1349.     POP    AX
  1350.     XCHG    AL,AH
  1351.     SAHF            ;RESTORE CHAR
  1352.     OR    AL,AL        ;CARRY OFF: NO ERROR
  1353.     RET            ;FROM "RECV"
  1354. RECCHAR ENDP
  1355. ;
  1356. ;---->    SEND: SEND A CHARACTER TO THE MODEM
  1357. ;
  1358. SEND    PROC    NEAR
  1359.     LAHF
  1360.     XCHG    AL,AH
  1361.     PUSH    AX
  1362.     XCHG    AL,AH        ;SAVE THE CHAR
  1363. ;
  1364. ;CHECK IF MONITORING SENT DATA
  1365. ;
  1366.     MOV    AL,SSEEFLG    ;CHECK IF MONITORING..
  1367.     OR    AL,AL        ;..SENT DATA
  1368.     JNZ    L00087
  1369.     JMP    MONOUT        ;..YES
  1370. ;
  1371. ;CHECK IF "VIEWING" THE FILE
  1372. ;
  1373. L00087: MOV    AL,VSEEFLG    ;GET VIEW FLAG
  1374.     OR    AL,AL        ;TEST IT
  1375.     JZ    L00088
  1376.     JMP    NOMONOT     ;NO
  1377. L00088: MOV    AL,DATAFLG    ;IS THIS
  1378.     OR    AL,AL        ;..DATA?    JNZ    MONOUT
  1379.     JMP    NOMONOT     ;..NO.
  1380. MONOUT: POP    AX
  1381.     XCHG    AL,AH
  1382.     SAHF            ;GET THE CHAR
  1383.     LAHF
  1384.     XCHG    AL,AH
  1385.     PUSH    AX
  1386.     XCHG    AL,AH        ;SAVE IT
  1387.     CALL    SHOW        ;SHOW IT
  1388. NOMONOT:
  1389.     POP    AX
  1390.     XCHG    AL,AH
  1391.     SAHF            ;RESTORE CHAR
  1392.     LAHF
  1393.     XCHG    AL,AH
  1394.     PUSH    AX
  1395.     XCHG    AL,AH        ;SAVE IT
  1396.     ADD    AL,CL        ;CALC CKSUM
  1397.     MOV    CL,AL        ;SAVE CKSUM
  1398. SENDW:    PUSH    DX
  1399.     MOV    DX,MODCTLP
  1400.     IN    AL,DX        ;GET STATUS
  1401.     POP    DX
  1402.     AND    AL,MODSNDB    ;ISOLATE READY BIT
  1403.     CMP    AL,MODSNDR    ;READY? JZ    L00090
  1404.     JMP    SENDW        ;..NO, WAIT
  1405. L00090: POP    AX
  1406.     XCHG    AL,AH
  1407.     SAHF            ;GET CHAR
  1408.     PUSH    DX
  1409.     MOV    DX,MODDATP
  1410.     OUT    DX,AL        ;OUTPUT IT
  1411.     POP    DX
  1412.     RET            ;FROM "SEND"
  1413. SEND    ENDP
  1414. ;
  1415. ;---->    WAITNAK: WAITS FOR INITIAL NAK
  1416. ;
  1417. ;TO ENSURE NO DATA IS SENT UNTIL THE RECEIVING
  1418. ;PROGRAM IS READY, THIS ROUTINE WAITS FOR THE
  1419. ;THE FIRST TIMEOUT-NAK FROM THE RECEIVER.  (E)
  1420. ;CONTAINS THE # OF SECONDS TO WAIT.
  1421. ;
  1422. WAITNAK PROC    NEAR
  1423.     MOV    AL,VSEEFLG    ;VIEWING?    OR    AL,AL
  1424.     JNZ    L00091
  1425.     JMP    WAITNPR     ;PRINT MSG
  1426. L00091: MOV    AL,QFLG     ;QUIET..
  1427.     OR    AL,AL        ;..MODE?    JNZ    WAITNPR
  1428.     JMP    WAITNLP     ;YES, SKIP MSG
  1429. WAITNPR LABEL    NEAR
  1430.     PUSH    BX
  1431.     MOV    BX,OFFSET MSG13
  1432.     CALL    ILPRT        ;PRINT:
  1433.     POP    BX
  1434. WAITNLP LABEL    NEAR
  1435.     CALL    CKABORT     ;ABORT IF LOCAL CTL-X
  1436.     MOV    CH,1        ;TIMEOUT DELAY
  1437.     CALL    RECV        ;DID WE GET..
  1438.     CMP    AL,NAK        ;..A NAK?    JNZ    L00093
  1439.     RET            ;YES, SEND BLOCK
  1440. ;
  1441. L00093    LABEL    NEAR
  1442.     IF CANFLG
  1443.     CMP    AL,CAN        ;CTL-X FROM REMOTE?    JNZ    L00094
  1444.     JMP    ABORT        ;..YES, ABORT
  1445. L00094    LABEL    NEAR
  1446.     ENDIF
  1447. ;
  1448.     DEC    DL        ;80 TRIES?    JNZ    L00095
  1449.     JMP    ABORT        ;YES, ABORT
  1450. L00095: JMP    WAITNLP     ;NO, LOOP
  1451. WAITNAK ENDP
  1452. ;
  1453. ;
  1454. ;---->    PROCOPT: PROCESS COMMAND OPTIONS
  1455. ;
  1456. ;1) SAVES THE PRIMARY OPTION IN 'OPTION';
  1457. ;2) IF OPTION 'H' (HELP) IS ASKED FOR,
  1458. ;TRANSFERS DIRECTLY TO THE HELP PRINT;
  1459. ;3) SCANS THE SUB-OPTION CHARACTERS, AND FOR
  1460. ;EACH FOUND, ZEROS THE APPROPRIATE ENTRY IN
  1461. ;THE OPTION TABLE.  FOR EXAMPLE, IF 'D' IS
  1462. ;CODED (DISCONNECT) THEN THE 'D' STORED AT
  1463. ;'DISCFLG' IS SET TO 0 SO IT CAN BE TESTED
  1464. ;LATER.
  1465. ;
  1466. PROCOPT PROC    NEAR
  1467.     MOV    DX,OFFSET FCBNAME ;TO PRIMARY OPT.
  1468.     XCHG    BX,DX
  1469.     MOV    AL,ES:[BX]    ;GET PRIMARY OPT.
  1470.     XCHG    BX,DX
  1471.     MOV    OPTION,AL    ;SAVE IT
  1472.     CMP    AL,'X'          ;MODEM EXAMPLES?        JNZ     L00096
  1473.     JMP    EXAM        ;..YES, GIVE EXAMPLES
  1474. L00096: CMP    AL,'H'          ;MODEM H(ELP)?  JNZ     OPTLP
  1475.     JMP    HELP        ;..YES, GIVE HELP
  1476. OPTLP:    PUSHF
  1477.     INC    DX        ;TO SECONDARY OPTION
  1478.     POPF
  1479.     XCHG    BX,DX
  1480.     MOV    AL,ES:[BX]    ;GET CHAR
  1481.     XCHG    BX,DX
  1482. ;
  1483. ;IF YOU MOD THIS PROGRAM FOR >7 OPTIONS,
  1484. ;YOU MUST CHANGE THE FOLLOWING, SINCE
  1485. ;THERE WON'T BE A ' ' AFTER THE OPTION
  1486. ;IF A BAUD RATE WAS SPECIFIED.
  1487. ;
  1488.     CMP    AL,' '          ;NO MORE OPT'NS?        JNZ     L00097
  1489.     JMP    ENDOPT        ;..YES
  1490. ;SET THE APPROP. OPT: STORE 0 IN IT
  1491. L00097: MOV    BX,OFFSET OPTBL ;HL = ADDR OF 'OAQDSRV'
  1492.     MOV    CX,TABLESIZE    ;OPT TABLE LEN
  1493. OPTCK:    CMP    AL,BYTE PTR [BX] ;FOUND THE OPTION?    JZ    L00098
  1494.     JMP    OPTNO        ;NO, DON'T SET IT
  1495. L00098: MOV    BYTE PTR [BX],0 ;SET THE OPTION
  1496.     JMP    OPTLP        ;GET NEXT OPTION
  1497. OPTNO:    PUSHF
  1498.     INC    BX
  1499.     POPF            ;TO NEXT
  1500.     DEC    CX        ;MORE?    JZ    L00099
  1501.     JMP    OPTCK
  1502. ;OPTION NOT IN TABLE
  1503. L00099: JMP    BADOPT        ;SHOW BAD SUB OPTION
  1504. ;
  1505. ;IF "VIEW" WAS ASKED FOR, SET QUIET FLAG
  1506. ;
  1507. ENDOPT: MOV    AL,VSEEFLG    ;VIEW..
  1508.     OR    AL,AL        ;..ASKED FOR?    JZ    L00100
  1509.     RET            ;..NO, RET FROM 'PROCOPT'
  1510. L00100: MOV    QFLG,AL     ;YES, NO HDR/CKSUM PRT
  1511.     RET            ;FROM 'PROCOPT'
  1512. PROCOPT ENDP
  1513. ;
  1514. ;DONE - CLOSE UP SHOP
  1515. ;
  1516. DONE    PROC    NEAR
  1517.     MOV    AL,VSEEFLG    ;VIEWING?    OR    AL,AL
  1518.     JNZ    L00101
  1519.     JMP    DONETC        ;SHOW MSG
  1520. L00101: MOV    AL,QFLG     ;QUIET
  1521.     OR    AL,AL        ;..MODE?    JNZ    DONETC
  1522.     JMP    DONECTE     ;YES, CK TERM/ECHO
  1523. DONETC: PUSH    BX
  1524.     MOV    BX,OFFSET MSG14
  1525.     CALL    ILPRT
  1526.     POP    BX
  1527. ;
  1528. ;CHECK IF TERMINAL OR ECHO SUB COMMAND
  1529. ;WAS SPECIFIED
  1530. ;
  1531. DONECTE:
  1532.     MOV    AL,TERMFLG    ;TERM?    OR    AL,AL
  1533.     JNZ    L00103
  1534.     JMP    TERM        ;..YES
  1535. L00103: MOV    AL,ECHOFLG    ;ECHO?    OR    AL,AL
  1536.     JNZ    CKDIS
  1537.     JMP    TRMECHO     ;..YES
  1538. ;
  1539. ;FALL INTO 'CKDIS'
  1540. ;
  1541. ;---->    CKDIS: CHECK IF DISCONNECT REQUESTED
  1542. ;
  1543. ;THIS ROUTINE IS JUMPED TO AT THE END OF
  1544. ;PROCESSING, AND DISCONNECTS THE PHONE IF
  1545. ;'D' WAS SPECIFIED AS A SUB-OPTION.
  1546. ;
  1547. CKDIS:    MOV    AL,DISCFLG    ;CHECK 'D' FLAG
  1548.     OR    AL,AL        ;REQUESTED?;                            x d x
  1549. ;    IF    NOT PMMI                 x e x
  1550. ;    JZ    L00106                     x l x
  1551. ;    JMP    EXIT                     x e x
  1552. ;L00106  LABEL    NEAR                     x t x
  1553. ;    ENDIF                         x e x
  1554. ;                             x d x
  1555. ;AWAIT C/R TO DISC. SO WE DON'T LOSE THE PHONE
  1556. ;
  1557.     PUSH    BX
  1558.     MOV    BX,OFFSET MSG15
  1559.     CALL    ILPRT
  1560.     POP    BX
  1561.     CALL    KEYIN
  1562.     LAHF
  1563.     XCHG    AL,AH
  1564.     PUSH    AX
  1565.     XCHG    AL,AH
  1566.     CALL    CRLF
  1567.     POP    AX
  1568.     XCHG    AL,AH
  1569.     SAHF
  1570.     CMP    AL,0DH
  1571.     JZ    DISCONN
  1572.     JMP    CKDIS            ;ASK AGAIN
  1573. ;
  1574. ;---->    DISCONN: DISCONNECT THE PHONE
  1575. ;
  1576. DISCONN LABEL    NEAR
  1577.     PUSH    BX
  1578.     MOV    BX,OFFSET MSG16
  1579.     CALL    ILPRT            ;PRINT:
  1580.     POP    BX
  1581.     JMP    EXIT
  1582. DONE    ENDP
  1583. ;
  1584. ;NO DISCONNECT, TYPEZZ MSG AS REMINDER THAT PHONE'S
  1585. ;ON HOOK
  1586. ;
  1587. ;
  1588. ;---->    INITMOD: INITIALIZED THE MODEM
  1589. ;
  1590. ;THIS ROUTINE IS USED TO INITIALIZE SERIAL
  1591. ;PORT USED BY THE PROGRAM.  IT INCLUDES SUPPORT FOR
  1592. ;SELECTING WHICH OF THE THREE UARTS SUPPORTED BY THE IBM/PC
  1593. ;ARCHITECTURE WILL BE USED FOR THIS TRANSMISSION
  1594. ;
  1595. ;
  1596. ;
  1597. INITMOD PROC    NEAR
  1598. ;
  1599. ;    ONLY THE "dtr up" PORTION OF THIS MODEM INITIALIZATION,
  1600. ;    [and THE PORT SELECTION]
  1601. ;    IS STATIC -- ALL OTHER PORT SETUP IS DONE EXTERNALLY, OR BY
  1602. ;    THE "I" SECONDARY OPTION - WHICH DEFAULTS THE COMx PORT
  1603. ;    TO 300 baud, 8 bits, 1stop bit, AND  n o  parity
  1604. ;
  1605. ;
  1606.     MOV    BX,BASE1U        ;POINT TO A UART
  1607.     XOR    AX,AX
  1608.     CMP    AL,URT3FLG        ;IS 3 REQUESTED (flags zeroed if found)
  1609.     JNE    INIT1            ;CONTINUE IF NOT
  1610.     MOV    BX,BASE3U        ;IF YES, POINT TO 3
  1611.     JMP    INIT2            ; AND DO PORT SETUP
  1612. INIT1:    CMP    AL,URT2FLG           ;IS 2 REQUESTED
  1613.     JNE    INIT2            ;DEFAULT TO ONE IF NOT
  1614.     MOV    BX,BASE2U        ;OR POINT TO TWO  AND
  1615. ;                    ; DO THE PORT POINTER SETUP
  1616. ;
  1617. ;    SETUP POINTERS TO THE UART PORTS     (SUPPORTS 3)
  1618. ;
  1619. INIT2:    MOV    AX,BX            ;BUILD
  1620.     ADD    AX,OFFDATP        ;
  1621.     MOV    MODDATP,AX        ;     MODDATP
  1622.     MOV    AX,BX            ;BUILD
  1623.     ADD    AX,OFFCTLP        ;
  1624.     MOV    MODCTLP,AX        ;MSR  MODCTLP
  1625.     MOV    AX,BX            ;BUILD
  1626.     ADD    AX,OFFCTL2        ;
  1627.     MOV    MODCTL2,AX        ;MCR  MODCTL2
  1628.     MOV    AX,BX            ;BUILD
  1629.     ADD    AX,OFFCTL3        ;
  1630.     MOV    MODCTL3,AX        ;LCR  MODCTL3
  1631. ;
  1632. ;
  1633. ;    NOW THAT A PORT [COM1 COM2 or COM3] IS SELECTED
  1634. ;        put up dtr FOR POOR FOLKS WITH
  1635. ;        COMMERCIAL MODEMS THAT REQUIRE IT.
  1636. ;        (poor folks, of course, is a relative term)
  1637. ;
  1638. ;                    ;
  1639.     MOV    AL,DTREADY        ;OUTPUT DTR UP
  1640.     PUSH    DX            ;  REQUEST TO
  1641.     MOV    DX,MODCTL2        ;MODEM CONTROL REGISTER
  1642.     OUT    DX,AL            ;
  1643. ;
  1644. ;    check for uart init request -- set COMx TO 300,N,8,1 IF 0
  1645. ;
  1646.     MOV    al,DUMYFLG
  1647.     or    al,al
  1648.     jnz    noinit
  1649.     push    dx
  1650.     mov    dx,3fbh
  1651.     mov    al,80h
  1652.     out    dx,al
  1653.     mov    dx,3f9h
  1654.     mov    al,01h
  1655.     out    dx,al
  1656.     mov    dx,3f8h
  1657.     mov    al,80h
  1658.     out    dx,al
  1659.     mov    dx,3fbh
  1660.     mov    al,03h
  1661.     out    dx,al
  1662. ;
  1663. ;    the above sequence defaults the modem to 300,n,8,1 ..
  1664. ;
  1665. NOINIT: POP    DX        ;RESTORE DX BEFORE LEAVING
  1666.     RET
  1667. INITMOD ENDP
  1668. ;
  1669. ;---->    MOVEFCB: MOVES FCB(2) TO FCB
  1670. ;
  1671. ;I ATTEMPTED TO MAKE THE MODEM COMMAND 'NATURAL',
  1672. ;I.E. MODEM SEND FILENAME (MODEM S FN.FT) RATHER
  1673. ;THAT MODEM FILENAME SEND (MODEM FN.FT S) SO THIS
  1674. ;ROUTINE MOVES THE FILENAME FROM THE SECOND FCB
  1675. ;TO THE FIRST
  1676. ;
  1677. MOVEFCB PROC    NEAR
  1678.     MOV    BX,OFFSET FCB2    ;FROM
  1679.     MOV    DX,OFFSET FCB    ;TO
  1680.     MOV    CH,16        ;LEN
  1681.     PUSH    DS        ;SAVE DS
  1682.     PUSH    ES        ;MOVE ES ...
  1683.     POP    DS        ;... TO DS
  1684.     CALL    MOVE        ;DO THE MOVE
  1685.     POP    DS        ;RESTORE DS
  1686.     XOR    AL,AL        ;GET 0
  1687.     MOV    FCBCR,AL    ;ZERO CURRENT RECORD
  1688.     MOV    FCBRR,AL    ;..AND RANDOM RECORD
  1689.     RET
  1690. MOVEFCB ENDP
  1691. ;
  1692. ;---->    SHOW: SHOWS CHAR SENT/RECEIVED
  1693. ;
  1694. ;CR, LF, AND TAB ARE SHOWN.  ALL OTHER
  1695. ;NON-PRINTABLE CHARACTERS ARE SHOWN IN
  1696. ;HEX AS (XX)
  1697. ;
  1698. SHOW    PROC    NEAR
  1699.     CMP    AL,LF        ;LF?    JNZ    L00122
  1700.     JMP    CTYPEZZ     ;..YES, TYPEZZ IT
  1701. L00122: CMP    AL,CR        ;CR?    JNZ    L00123
  1702.     JMP    CTYPEZZ     ;..YES, TYPEZZ IT
  1703. L00123: CMP    AL,09        ;TAB
  1704.     JNZ    L00124
  1705.     JMP    CTYPEZZ     ;..YES, TYPEZZ IT
  1706. L00124: CMP    AL,' '          ;CTL-CHR?       JAE     L00125
  1707.     JMP    SHOWHEX     ;YES, SHOW IN HEX
  1708. L00125: CMP    AL,7FH        ;DEL?    JAE    SHOWHEX
  1709.     JMP    CTYPEZZ     ;NO, TYPEZZ THE CHAR
  1710. SHOWHEX LABEL    NEAR
  1711.     LAHF
  1712.     XCHG    AL,AH
  1713.     PUSH    AX
  1714.     XCHG    AL,AH        ;SAVE THE CHAR
  1715.     MOV    AL,'('          ;TYPEZZ..
  1716.     CALL    CTYPEZZ     ;..'('
  1717.     POP    AX
  1718.     XCHG    AL,AH
  1719.     SAHF            ;THEN..
  1720.     CALL    HEXO        ;..THE CHAR
  1721.     MOV    AL,')'          ;THEN..
  1722.     JMP    CTYPEZZ     ;..')' AND RETURN.
  1723. ;
  1724. ;---->    CTYPEZZ: TYPEZZS VIA CP/M SO TABS ARE EXPANDED
  1725. ;
  1726. CTYPEZZ LABEL    NEAR
  1727.     PUSH    CX        ;SAVE..
  1728.     PUSH    DX        ;..ALL..
  1729.     PUSH    BX        ;..REGS
  1730.     MOV    DL,AL        ;CHAR TO E
  1731.     MOV    CL,WRCON    ;GET BDOS FNC
  1732.     CALL    BDOS        ;PRIN THE CHR
  1733.     POP    BX        ;RESTORE..
  1734.     POP    DX        ;..ALL..
  1735.     POP    CX        ;..REGS
  1736.     RET            ;FROM "CTYPEZZ"
  1737. SHOW    ENDP
  1738. ;
  1739. CRLF    PROC    NEAR
  1740.     MOV    AL,CR
  1741.     CALL    TYPEZZ
  1742.     MOV    AL,LF
  1743. CRLF    ENDP
  1744. ;
  1745. ;---->    TYPEZZ: TYPEZZ VIA DIRECT BDOS ACCESS
  1746. ;
  1747. ;THIS ROUTINE BYPASSES CP/M'S CTL-S, CTL-C
  1748. ;TESTS.
  1749. ;
  1750. TYPEZZ    PROC    NEAR
  1751.     LAHF
  1752.     XCHG    AL,AH
  1753.     PUSH    AX
  1754.     XCHG    AL,AH        ;SAVE CHAR
  1755.     PUSH    CX        ;AND B
  1756. VTYPEZZ LABEL    NEAR
  1757.     MOV    CL,DCON     ;GET BDOS FNC
  1758.     MOV    DL,AL
  1759.     CALL    BDOS
  1760.     POP    CX
  1761.     POP    AX
  1762.     XCHG    AL,AH
  1763.     SAHF
  1764.     RET            ;FROM "TYPEZZ"
  1765. TYPEZZ    ENDP
  1766. ;
  1767. ;KEYBOARD STATUS
  1768. ;
  1769. ;    This routine has been changed from CP/M-86: the service for
  1770. ;    MS-DOS differs in several respects.. [CP/M version uses
  1771. ;    x'FE' in DL and calls "DCON" which isn't supported
  1772. ;    in MSDOS .. SO we use the CONSOLE STATUS service.
  1773. ;
  1774. ;
  1775. STAT    PROC    NEAR
  1776.     MOV    CL,CONST    ;GET BDOS FNC
  1777. ;    MOV    DL,0FfH     ;**Conventions changed from CP/M !!!
  1778.     CALL    BDOS
  1779.     OR    AL,AL        ;0 => NOT READY
  1780. ;                ;AL = FF if char ready: else =00
  1781.     RET
  1782. STAT    ENDP
  1783. ;
  1784. ;KEYBOARD INPUT
  1785. ;
  1786. ;    This routine should be changed to use direct BIOS interface.
  1787. ;    with the current BDOS call [DCON = 6] the CTRL-BREAK and
  1788. ;    CTRL-C sequences are intercepted and interpreted as
  1789. ;    termination requests
  1790. ;
  1791. ;
  1792. ;
  1793. KEYIN    PROC    NEAR
  1794.     MOV    CL,DCON     ;GET BDOS FNC
  1795.     MOV    DL,0FFH
  1796.     CALL    BDOS
  1797.     JZ    KEYIN        ;ZERO FLAG SET IF NO CHARACTER
  1798.     CMP    AL,CTLCCHR
  1799.     JNE    KEY001
  1800.     MOV    AL,CTLCHAR
  1801.     ret            ;return if ctl-c to be sent
  1802. ;
  1803. ;    SPECIAL FUNCTION KEY SUPPORT
  1804. ;                      **ALT-C ==> transmits CTRL-C
  1805. ;    Support will be added here for
  1806. ;    use of ALT-? keyins for shuch things as BAUD rate shift,
  1807. ;    mode changes (quiet/noisy On/Off of R,S,Q secondary optns.)
  1808. ;
  1809. ;
  1810. key001: cmp    al,0
  1811.     je    altkey
  1812.     RET            ;return if not "00" for special function code
  1813. altkey: mov    cl,dcon     ;set bdos function
  1814.     mov    dl,0ffh     ;ask for character
  1815.     call    bdos
  1816.     jz    altkey        ;spin until second code
  1817. ;    if we got here it should be a special scan code
  1818. ;
  1819.     cmp    al,46        ;replace
  1820.     jne    akey01        ;    ALT-C
  1821.     mov    al,ctlchar    ;  WITH
  1822.     ret            ;    CTRL-C
  1823. AKEY01: CMP    AL,59
  1824.     JNL    AKEY02
  1825.     RET
  1826. AKEY02: CMP    AL,68
  1827.     JL    AKEY03
  1828.     RET
  1829. AKEY03: NOP
  1830.     NOP
  1831.     RET
  1832. KEYIN    ENDP
  1833. ;
  1834. ;HEX OUTPUT
  1835. ;
  1836. HEXO    PROC    NEAR
  1837.     LAHF
  1838.     XCHG    AL,AH
  1839.     PUSH    AX
  1840.     XCHG    AL,AH        ;SAVE FOR RIGHT DIGIT
  1841.     RCR    AL,1        ;RIGHT..
  1842.     RCR    AL,1        ;..JUSTIFY..
  1843.     RCR    AL,1        ;..LEFT..
  1844.     RCR    AL,1        ;..DIGIT..
  1845.     CALL    NIBBL        ;PRINT LEFT DIGIT
  1846.     POP    AX
  1847.     XCHG    AL,AH
  1848.     SAHF            ;RESTORE RIGHT
  1849. NIBBL:    AND    AL,0FH        ;ISOLATE DIGIT
  1850.     CMP    AL,10        ;IS IS <10?    JAE    L00127
  1851.     JMP    ISNUM        ;YES, NOT ALPHA
  1852. L00127: ADD    AL,7        ;ADD ALPHA BIAS
  1853. ISNUM:    ADD    AL,'0'          ;MAKE PRINTABLE
  1854.     JMP    TYPEZZ        ;..THEN TYPEZZ IT
  1855. HEXO    ENDP
  1856. ;
  1857. ;---->    CKQUIT: QUIT/RETRY AFTER MULTIPLE ERRS.
  1858. ;
  1859. ;RETURNS W/ ZERO SET IF "RETRY" ASKED FOR
  1860. ;
  1861. CKQUIT    PROC    NEAR
  1862.     XOR    AL,AL        ;ZERO..
  1863.     MOV    ERRCT,AL    ;..ERROR COUNT
  1864.     PUSH    BX
  1865.     MOV    BX,OFFSET MSG18
  1866.     CALL    ILPRT        ;PRINT:
  1867.     POP    BX
  1868.     CALL    KEYIN        ;QUIT/RETRY
  1869.     LAHF
  1870.     XCHG    AL,AH
  1871.     PUSH    AX
  1872.     XCHG    AL,AH
  1873.     CALL    CRLF
  1874.     POP    AX
  1875.     XCHG    AL,AH
  1876.     SAHF
  1877.     AND    AL,5FH        ;MAKE UPPER CASE
  1878.     CMP    AL,'R'          ;RETRY? JNZ     L00128
  1879.     RET            ;'KEEP ON TRUCKIN'
  1880. L00128: CMP    AL,'Q'          ;QUIT?  JZ      L00129
  1881.     JMP    CKQUIT        ;NO, ASK AGAIN
  1882. L00129: OR    AL,AL        ;SET NON-ZERO
  1883.     RET
  1884. CKQUIT    ENDP
  1885. ;
  1886. ;---->    ILPRT: INLINE PRINT OF MSG
  1887. ;
  1888. ;THE CALL TO ILPRT IS FOLLOWED BY A MESSAGE,
  1889. ;BINARY 0 AS THE END.  BINARY 1 MAY BE USED TO
  1890. ;PAUSE (MESSAGE 'PRESS RETURN TO CONTINUE')
  1891. ;
  1892. ILPRT    PROC    NEAR
  1893. ILPLP:    MOV    AL,BYTE PTR[BX]
  1894.     OR    AL,AL        ;END OF MSG?    JNZ    L00130
  1895.     JMP    ILPRET        ;..YES, RETURN
  1896. L00130: CMP    AL,1        ;PAUSE? JNZ    L00131
  1897.     JMP    ILPAUSE     ;..YES
  1898. L00131: CALL    CTYPEZZ     ;TYPEZZ THE MSG
  1899. ILPNEXT:
  1900.     PUSHF
  1901.     INC    BX
  1902.     POPF            ;TO NEXT CHAR
  1903.     JMP    ILPLP        ;LOOP
  1904. ;
  1905. ;PAUSE WHILE TYPING HELP SO INFO DOESN'T
  1906. ;    SCROLL OFF OF VIDEO SCREENS
  1907. ;
  1908. ILPAUSE:
  1909.     PUSH    BX
  1910.     MOV    BX,OFFSET MSG19
  1911.     CALL    ILPRT        ;PRINT:
  1912.     POP    BX
  1913.     CALL    KEYIN        ;GET ANY CHAR
  1914.     CMP    AL,'C'-40H      ;REBOOT?        JNZ     L09132          ;EXIT IF QUITCHAR
  1915.     JMP    EXIT
  1916. L09132: CMP    AL,'I'-40H      ;ALT REBOOT?    JNZ     L00132          ;
  1917.     JMP    EXIT        ;YES.
  1918. L00132: JMP    ILPNEXT     ;LOOP
  1919. ILPRET: RET            ;PAST MSG
  1920. ILPRT    ENDP
  1921. ;
  1922. ;---->    PRTMSG: PRINTS MSG POINTED TO BY (DE)
  1923. ;
  1924. ;A '$' IS THE ENDING DELIMITER FOR THE PRINT.
  1925. ;NO REGISTERS SAVED.
  1926. ;
  1927. PRTMSG    PROC    NEAR
  1928.     MOV    CL,PRINT    ;GET BDOS FNC
  1929.     JMP    BDOS        ;PRINT MESSAGE, RETURN
  1930. PRTMSG    ENDP
  1931. ;
  1932. ;---->    ERXIT: EXIT PRINTING MSG FOLLOWING CALL
  1933. ;
  1934. ERXIT    PROC    NEAR
  1935.     POP    BX        ;GET MESSAGE
  1936.     CALL    PRTMSG        ;PRINT IT
  1937.     CALL    CKDIS        ;DISCONNECT?    JMP    EXIT        ;RETURN TO PC DOS
  1938. ERXIT    ENDP
  1939. ;
  1940. ;MOVE 128 CHARACTERS
  1941. ;
  1942. MOVE128 PROC    NEAR
  1943.     MOV    CH,128        ;SET MOVE COUNT
  1944. ;
  1945. ;MOVE FROM (HL) TO (DE) LENGTH IN (B)
  1946. ;
  1947. MOVE:    MOV    AL,BYTE PTR [BX] ;GET A CHAR
  1948.     XCHG    BX,DX
  1949.     MOV    [BX],AL
  1950.     XCHG    BX,DX        ;STORE IT
  1951.     PUSHF
  1952.     INC    BX
  1953.     POPF            ;TO NEXT "FROM"
  1954.     PUSHF
  1955.     INC    DX
  1956.     POPF            ;TO NEXT "TO"
  1957.     DEC    CH        ;MORE?    JZ    L00133
  1958.     JMP    MOVE        ;..YES, LOOP
  1959. L00133: RET            ;..NO, RETURN
  1960. MOVE128 ENDP
  1961. ;
  1962. BDOS    PROC    NEAR
  1963.     PUSH    BX
  1964.     PUSH    CX
  1965.     PUSH    DX
  1966.     MOV    AH,CL        ;MOVE FNC FOR PC DOS
  1967.     INT    21H        ;INVOKE PC DOS SERVICE
  1968.     POP    DX
  1969.     POP    CX
  1970.     POP    BX
  1971.     RET
  1972. BDOS    ENDP
  1973. ;
  1974. BADOPT: CALL    TYPEZZ
  1975.     PUSH    BX
  1976.     MOV    BX,OFFSET MSG25
  1977.     CALL    ILPRT
  1978.     POP    BX
  1979. HELP:    PUSH    BX
  1980.     MOV    BX,OFFSET MSG26
  1981.     CALL    ILPRT
  1982.     POP    BX
  1983.     JMP    copyrt
  1984. EXAM:    PUSH    BX
  1985.     MOV    BX,OFFSET MSG27
  1986.     CALL    ILPRT
  1987.     POP    BX
  1988.     JMP    copyrt
  1989. ;
  1990. ;  Print Limited license with "HELP" request output
  1991. ;
  1992. copyrt: CALL    STAT
  1993. ;
  1994. ;    CLEAR THE SCREEN (cursor = 1,1)
  1995. ;
  1996.     SUB    CX,CX        ;UPPER LEFT CORNER
  1997.     MOV    DX,184FH    ;BOTTOM RIGHT CORNER
  1998.     MOV    BH,7        ;NORMAL ATTRIB FOR CLS
  1999.     SCROLL            ;INVOKE BIOS TO CLEAR SCREEN
  2000.     SUB    DX,DX        ;POINT TO ROW 1,COL 1
  2001.     LOCATE            ;SET THE CURSOR TO TOP LEFT
  2002. ;
  2003. ;    PRINT COPYRIGHT NOTICE    AND PAUSE
  2004. ;
  2005.     mov    bx,offset msg00 ;point to copyright notice
  2006.     call    ilprt        ; go print it (PAUSE)
  2007. ;
  2008. ;    RETURN TO CALLER
  2009. ;
  2010.     jmp    exit
  2011. ;
  2012. ;
  2013. ;
  2014. MODEM    ENDS
  2015.     SUBTTL    'MODIFICATION HISTORY AND CREDITS'
  2016.     PAGE
  2017. ;
  2018. ;* * * * * * * * * * * * * * * * * * * * * * * * *
  2019. ;*                         *
  2020. ;*   THIS PROGRAM DOCUMENTED IN "MODEM.DOC"      *
  2021. ;*                         *
  2022. ;* * * * * * * * * * * * * * * * * * * * * * * * *
  2023. ;* THIS PROGRAM WAS "MODEM.ASM" BUT and then was *
  2024. ;* TEMPORARILY NAMED "MODEM2.ASM" SO PEOPLE      *
  2025. ;* WILL REALIZE IT IS AN ENHANCEMENT OF      *
  2026. ;* THE ORIGINAL PROGRAM "MODEM.ASM" ON CP/M      *
  2027. ;* USER'S GROUP DISK 25.                         *
  2028. ;* * * * * * * * * * * * * * * * * * * * * * * * *
  2029. ;
  2030. ;PLEASE PASS ON MODS, BUGS, ETC, SO YOUR
  2031. ;FIXES OR ENHANCEMENTS MAY BE SHARED BY ALL,
  2032. ;
  2033. ;Please send to the bottom name on the list,
  2034. ;    OR TO ALL OF US - if you can afford
  2035. ;              the time
  2036. ;
  2037. ;    Ward Christensen
  2038. ;    688 E. 154th St. #5D
  2039. ;    Dolton, Il. 60419
  2040. ;
  2041. ;    (312) 849-6279
  2042. ;
  2043. ;You may send a self-addressed stamped postcard
  2044. ;to be informed of changes/bugs as they become
  2045. ;known.     [CP/M Version]
  2046. ;
  2047. ;
  2048. ;
  2049. ;    05/08/82
  2050. ;Modified for CP/M 86 and the IBM PC
  2051. ; by Randy Suess
  2052. ;    5219 Warwick
  2053. ;    Chicago, Ill 60641
  2054. ;    312-545 7535
  2055. ;
  2056. ;    06/03/82
  2057. ;Modified for PC DOS and the IBM PC
  2058. ;by Rick Mallinak
  2059. ;   22451 Franklin Dr.
  2060. ;   Richton Park, Ill 60471
  2061. ;   (312) 481-6459
  2062. ;
  2063. ;    08/11/82
  2064. ;Repaired for PC DOS 1.1 and IBM PC
  2065. ;by John Chapman
  2066. ;   844 S. Madison St.
  2067. ;   Hinsdale Illinois 60521
  2068. ;   (312) 325-3081
  2069. ;          CS: 70205,1217
  2070. ;
  2071. ;
  2072. ;
  2073. ;    --------------------
  2074. ;    MODIFICATION HISTORY
  2075. ;    --------------------
  2076. ;
  2077. ;    09/23/77
  2078. ;ORIGINALLY WRITTEN BY WARD CHRISTENSEN
  2079. ;
  2080. ;    04/26/79
  2081. ;REWRITTEN BY WARD CHRISTENSEN TO COMBINE
  2082. ;IMPROVEMENTS TO THE ORIGINAL MADE BY WARD
  2083. ;AND BY KEITH PETERSEN, W8SDZ, AND SUGGESTIONS
  2084. ;BY JIM BELL WHICH KEITH IMPLEMENTED.  SEE
  2085. ;MODEM.DOC FOR ADDITIONAL HISTORICAL
  2086. ;INFORMATION AND DOCUMENSATION.
  2087. ;
  2088. ;    05/09/79
  2089. ;ALLOW 'T' AND 'E' SUB-OPTIONS TO GO TO TERMINAL
  2090. ;OR ECHO MODEM AFTER TRANSFERRING A FILE.  (WLC)
  2091. ;
  2092. ;    05/22/79
  2093. ;ADD FEATURE TO MAKE RECEIVE FILE ROUTINE SAY
  2094. ;FILE SUCCESSFULLY OPENED, WHEN IN QUIET MODE.
  2095. ;MOVE INITIAL GOBBLE GARBAGE INPUTS TO BEFORE
  2096. ;COMMAND CPI'S SO ALL MODES ARE CLEARED. CHANGE
  2097. ;INITIAL SEND WAIT TO 80 SECS TO ALLOW MORE TIME
  2098. ;FOR RECEIVING END TO COME UP. ADD 'H' AFTER MSG
  2099. ;THAT SHOWS NUMBER OF SECTORS IN EXTENT ABOUT TO
  2100. ;BE SENT.  (KBP)
  2101. ;
  2102. ;    05/24/79
  2103. ;FIX MISSING RETURN INSTRUCTION AT END OF
  2104. ;INITIALIZATION ROUTINE.  (KBP)
  2105. ;
  2106. ;    07/13/79
  2107. ;PUT IN RESET OF DMA ADDR TO 80H AFTER
  2108. ;FILE RECEIVE, BECAUSE "SUBMIT" UNDER CP/M
  2109. ;DOESN'T RESET IT BEFORE READING THE
  2110. ;NEXT SUBMITTED COMMAND. /// ALSO DELETE
  2111. ;CODE FOR "CANCEL" AS IT'S JUST TOO EASY
  2112. ;TO INTENTIONALLY GET A CANCEL AS A
  2113. ;GARBAGED LINE CHARACTER.
  2114. ;
  2115. ;;
  2116. ;        05/82
  2117. ;
  2118. ;Rewitten for CP/M-86 by Randy Suess
  2119. ; Changes mainly to interface with
  2120. ; the CP/M-86 BDOS services
  2121. ;
  2122. ;        06/82
  2123. ;
  2124. ;Randy's version altered by Rick Mallinak
  2125. ;to beacceptable to PC/DOS assembler.
  2126. ;Comments added and changes made to
  2127. ;support multiple segment version
  2128. ;
  2129. ;        08/82               ********CURRENT VERSION***********
  2130. ;
  2131. ;Rick's PC/DOS version reworked
  2132. ;to: a) RUn as a .COM file by
  2133. ;returning to single segment image;
  2134. ;b)terminal bugs repaired,; c) code
  2135. ;added to 'bring up' DTR as program
  2136. ;starts up [necessary for non-autodial
  2137. ;commercial modems]; and c) both
  2138. ;source and execution time messages
  2139. ;added to prevent Resale or Commmercial
  2140. ;use of this program.
  2141. ;
  2142. ;
  2143. ;
  2144.     END    MAIN
  2145.